วิธีใช้คำสั่ง strings บน Linux

เผยแพร่แล้ว: 2022-01-29
เทอร์มินัล Linux บนแล็ปท็อป
Fatmawati Achmad Zaenuri/Shutterstock.com

ต้องการดูข้อความภายในไฟล์ไบนารีหรือไฟล์ข้อมูลหรือไม่ คำสั่ง strings ของ Linux จะดึงบิตของข้อความที่เรียกว่า “สตริง” ออกมาให้คุณ

Linux เต็มไปด้วยคำสั่งที่ดูเหมือนวิธีแก้ปัญหาในการค้นหาปัญหา คำสั่ง strings ตกลงไปในแคมป์นั้นอย่างแน่นอน จุดประสงค์ของมันคืออะไร? มีคำสั่งชี้ไปที่คำสั่งที่แสดงรายการสตริงที่พิมพ์ได้จากภายในไฟล์ไบนารีหรือไม่?

ลองก้าวถอยหลัง ไฟล์ไบนารี เช่น ไฟล์โปรแกรม อาจมีสตริงข้อความที่มนุษย์อ่านได้ แต่คุณจะได้เห็นพวกเขาได้อย่างไร? หากคุณใช้ cat หรือ less นั้น คุณมักจะจบลงด้วยหน้าต่างเทอร์มินัลที่แขวนอยู่ โปรแกรมที่ออกแบบมาให้ทำงานกับไฟล์ข้อความไม่สามารถรับมือได้ดีหากป้อนอักขระที่ไม่สามารถพิมพ์ได้เข้ามา

ไบต์ส่วนใหญ่ภายในไฟล์ไบนารีไม่สามารถอ่านได้โดยมนุษย์และไม่สามารถพิมพ์ไปยังหน้าต่างเทอร์มินัลในลักษณะที่เหมาะสม ไม่มีอักขระหรือสัญลักษณ์มาตรฐานที่ใช้แทนค่าไบนารีที่ไม่ตรงกับอักขระที่เป็นตัวอักษรและตัวเลขคละกัน เครื่องหมายวรรคตอน หรือช่องว่าง เรียกรวมกันว่าอักขระเหล่านี้ "พิมพ์ได้" ส่วนที่เหลือเป็นอักขระที่ "ไม่สามารถพิมพ์ได้"

ดังนั้น การพยายามดูหรือค้นหาผ่านไบนารีหรือไฟล์ข้อมูลสำหรับสตริงข้อความจึงเป็นปัญหา และนั่นคือที่มาของ strings โดยจะแยกสตริงของอักขระที่พิมพ์ได้ออกจากไฟล์เพื่อให้คำสั่งอื่นๆ สามารถใช้สตริงได้โดยไม่ต้องโต้แย้งกับอักขระที่ไม่สามารถพิมพ์ได้

การใช้คำสั่งสตริง

คำสั่ง strings ไม่มีอะไรซับซ้อน และการใช้งานพื้นฐานนั้นง่ายมาก เราระบุชื่อไฟล์ที่เราต้องการให้ strings ค้นหาในบรรทัดคำสั่ง

โฆษณา

ในที่นี้ เราจะใช้สตริงในไฟล์ไบนารี—ไฟล์เรียกทำงาน—เรียกว่า “jibber” เราพิมพ์ strings เว้นวรรค "jibber" แล้วกด Enter

 สตริง jibber 

สตริงถูกแยกจากไฟล์และแสดงอยู่ในหน้าต่างเทอร์มินัล

การตั้งค่าความยาวขั้นต่ำของสตริง

โดยค่าเริ่มต้น สตริงจะค้นหาสตริงที่มีอักขระสี่ตัวขึ้นไป หากต้องการตั้งค่าความยาวขั้นต่ำที่ยาวขึ้นหรือสั้นลง ให้ใช้ตัวเลือก -n (ความยาวขั้นต่ำ)

โปรดทราบว่ายิ่งความยาวขั้นต่ำสั้นลงเท่าใด โอกาสที่คุณจะเห็นขยะก็จะสูงขึ้นเท่านั้น

ค่าไบนารีบางค่ามีค่าตัวเลขเหมือนกันกับค่าที่แสดงอักขระที่พิมพ์ได้ หากค่าตัวเลขสองค่าเหล่านี้อยู่เคียงข้างกันในไฟล์ และคุณระบุความยาวขั้นต่ำเป็นสองค่า ไบต์เหล่านั้นจะถูกรายงานราวกับว่าเป็นสตริง

โฆษณา

ในการขอให้ strings ใช้สองเป็นความยาวขั้นต่ำ ให้ใช้คำสั่งต่อไปนี้

 strings -n 2 jibber 

ตอนนี้เรามีสตริงตัวอักษรสองตัวรวมอยู่ในผลลัพธ์แล้ว โปรดทราบว่าช่องว่างจะถูกนับเป็นอักขระที่พิมพ์ได้

ร้อยสายผ่าน Less

เนื่องจากความยาวของเอาต์พุตจาก strings เราจะไพพ์ผ่านให้ less จากนั้นเราสามารถเลื่อนดูไฟล์เพื่อค้นหาข้อความที่น่าสนใจ

 strings jibber | น้อย 

รายชื่อถูกนำเสนอสำหรับเราใน less โดยที่ด้านบนสุดของรายชื่อแสดงก่อน

การใช้สตริงกับ Object Files

โดยทั่วไป ไฟล์ซอร์สโค้ดของโปรแกรมจะถูกคอมไพล์เป็นไฟล์อ็อบเจ็กต์ สิ่งเหล่านี้เชื่อมโยงกับไฟล์ไลบรารีเพื่อสร้างไฟล์ปฏิบัติการแบบไบนารี เรามีไฟล์อ็อบเจ็กต์ jibber อยู่ในมือ ดังนั้นเรามาดูภายในไฟล์กัน สังเกตนามสกุลไฟล์ “.o”

 jibber.o | น้อย 

สตริงชุดแรกทั้งหมดจะถูกรวมไว้ที่คอลัมน์ที่ 8 หากมีความยาวเกินแปดอักขระ หากห่อไว้ อักขระ "H" จะอยู่ในคอลัมน์ที่เก้า คุณอาจรู้จักสตริงเหล่านี้เป็นคำสั่ง SQL

โฆษณา

การเลื่อนดูผลลัพธ์เผยให้เห็นว่าการจัดรูปแบบนี้ไม่ได้ใช้ตลอดทั้งไฟล์

เป็นเรื่องที่น่าสนใจที่จะเห็นความแตกต่างในสตริงข้อความระหว่างไฟล์อ็อบเจ็กต์และไฟล์เรียกทำงานที่เสร็จสิ้น

การค้นหาในพื้นที่เฉพาะในไฟล์

โปรแกรมที่คอมไพล์แล้วจะมีส่วนต่างๆ ในตัวที่ใช้เก็บข้อความ โดยค่าเริ่มต้น strings จะค้นหาทั้งไฟล์เพื่อค้นหาข้อความ เหมือนกับว่าคุณเคยใช้ตัวเลือก -a (ทั้งหมด) หากต้องการให้สตริงค้นหาเฉพาะในส่วนข้อมูลที่เริ่มต้นและโหลดในไฟล์ ให้ใช้ตัวเลือก -d (ข้อมูล)

 strings -d jibber | น้อย 

เว้นแต่คุณจะมีเหตุผลที่ดี คุณอาจใช้การตั้งค่าเริ่มต้นและค้นหาไฟล์ทั้งหมด

การพิมพ์ออฟเซ็ตสตริง

เราสามารถให้ strings พิมพ์ออฟเซ็ตตั้งแต่เริ่มต้นไฟล์ที่แต่ละสตริงตั้งอยู่ เมื่อต้องการทำสิ่งนี้ ให้ใช้ตัวเลือก -o (ออฟเซ็ต)

 strings -o parse_phrases | น้อย 

ออฟเซ็ตจะได้รับใน Octal

หากต้องการให้ออฟเซ็ตแสดงในฐานตัวเลขอื่น เช่น ทศนิยมหรือเลขฐานสิบหก ให้ใช้ตัวเลือก -t (radix) ตัวเลือกฐานจะต้องตามด้วย d (ทศนิยม), x (ฐานสิบหก) หรือ o (ฐานแปด) การใช้ -to เหมือนกับการใช้ -o

 strings -td parse_phrases | น้อย 

ออฟเซ็ตจะถูกพิมพ์เป็นทศนิยม

 strings -tx parse_phrases | น้อย 

ตอนนี้ออฟเซ็ตพิมพ์เป็นเลขฐานสิบหก

รวมถึงช่องว่าง

strings จะถือว่าอักขระแท็บและช่องว่างเป็นส่วนหนึ่งของสตริงที่พบ อักขระช่องว่างอื่นๆ เช่น การขึ้นบรรทัดใหม่และการขึ้นบรรทัดใหม่ จะไม่ถือว่าเป็นส่วนหนึ่งของสตริง ตัวเลือก -w (ช่องว่าง) ทำให้สตริงปฏิบัติต่ออักขระช่องว่างทั้งหมดราวกับว่าเป็นส่วนหนึ่งของสตริง

 strings -w add_data | น้อย 

โฆษณา

เราสามารถเห็นบรรทัดว่างในผลลัพธ์ ซึ่งเป็นผลมาจากการขึ้นบรรทัดใหม่ (ล่องหน) และอักขระขึ้นบรรทัดใหม่ที่ส่วนท้ายของบรรทัดที่สอง

เราไม่ได้จำกัดแค่ไฟล์

เราสามารถใช้ strings กับอะไรก็ได้ที่เป็นหรือสร้างกระแสข้อมูลไบต์ได้

ด้วยคำสั่งนี้ เราสามารถดูผ่านหน่วยความจำเข้าถึงโดยสุ่ม (RAM) ของคอมพิวเตอร์ของเราได้

เราจำเป็นต้องใช้ sudo เพราะเรากำลังเข้าถึง /dev/mem นี่คือไฟล์อุปกรณ์อักขระที่เก็บรูปภาพของหน่วยความจำหลักของคอมพิวเตอร์ของคุณ

 sudo strings /dev/mem | น้อย 

รายการไม่ใช่เนื้อหาทั้งหมดของแรมของคุณ เป็นเพียงสายอักขระที่สามารถดึงออกมาจากมันได้

ที่เกี่ยวข้อง: "ทุกอย่างเป็นไฟล์" หมายถึงอะไรใน Linux?

ค้นหาไฟล์จำนวนมากพร้อมกัน

สามารถใช้สัญลักษณ์แทนเพื่อเลือกกลุ่มของไฟล์ที่จะค้นหาได้ อักขระ * แทนอักขระหลายตัว และ ? อักขระแสดงถึงอักขระตัวเดียว คุณยังสามารถเลือกที่จะระบุชื่อไฟล์จำนวนมากบนบรรทัดคำสั่งได้

โฆษณา

เราจะใช้สัญลักษณ์แทนและค้นหาไฟล์ที่เรียกใช้งานได้ทั้งหมดในไดเร็กทอรี /bin เนื่องจากรายชื่อจะมีผลลัพธ์จากหลายไฟล์ เราจะใช้ตัวเลือก -f (ชื่อไฟล์) ซึ่งจะพิมพ์ชื่อไฟล์ที่จุดเริ่มต้นของแต่ละบรรทัด จากนั้นเราจะดูได้ว่าแต่ละสตริงถูกพบในไฟล์ใด

เรากำลังส่งผลลัพธ์ผ่าน grep และค้นหาสตริงที่มีคำว่า "ลิขสิทธิ์"

 strings -f /bin/* | ลิขสิทธิ์ 

เราได้รับรายการประกาศลิขสิทธิ์สำหรับแต่ละไฟล์อย่างละเอียดในไดเร็กทอรี /bin โดยมีชื่อไฟล์อยู่ที่จุดเริ่มต้นของแต่ละบรรทัด

สตริง Unraveled

ไม่มีความลึกลับสำหรับสตริง มันเป็นคำสั่ง Linux ทั่วไป มันทำสิ่งที่เจาะจงมากและทำได้ดีมาก

เป็นฟันเฟืองอีกตัวหนึ่งของ Linux และมีชีวิตชีวาขึ้นเมื่อทำงานกับคำสั่งอื่นๆ เมื่อคุณเห็นว่าสามารถอยู่ระหว่างไฟล์ไบนารีและเครื่องมืออื่นๆ เช่น grep ได้อย่างไร คุณจะเริ่มชื่นชมฟังก์ชันการทำงานของคำสั่งที่คลุมเครือเล็กน้อยนี้

ที่เกี่ยวข้อง: แล็ปท็อป Linux ที่ดีที่สุดสำหรับนักพัฒนาและผู้ที่ชื่นชอบ