如何在 Linux 上使用 strings 命令
已發表: 2022-01-29 想查看二進製文件或數據文件中的文本嗎? Linux strings
命令會為您提取那些稱為“字符串”的文本。
Linux 充滿了看起來像是尋找問題的解決方案的命令。 strings
命令肯定屬於那個陣營。 它的目的是什麼? 是否有一個命令可以列出二進製文件中的可打印字符串?
讓我們後退一步。 二進製文件(例如程序文件)可能包含人類可讀的文本字符串。 但是你怎麼能看到他們呢? 如果您使用cat
或less
,您可能最終會看到一個掛起的終端窗口。 為處理文本文件而設計的程序如果輸入了不可打印的字符,就不能很好地處理它們。
二進製文件中的大多數字節不是人類可讀的,並且無法以任何有意義的方式打印到終端窗口。 沒有字符或標準符號來表示與字母數字字符、標點符號或空格不對應的二進制值。 這些統稱為“可打印”字符。 其餘的是“不可打印”字符。
因此,試圖在二進製文件或數據文件中查看或搜索文本字符串是一個問題。 這就是strings
的用武之地。它從文件中提取可打印字符的字符串,以便其他命令可以使用這些字符串,而不必與不可打印的字符競爭。
使用字符串命令
strings
命令沒有什麼複雜的,它的基本使用非常簡單。 我們提供了我們希望在命令行上搜索strings
的文件的名稱。
在這裡,我們將在名為“jibber”的二進製文件(可執行文件)上使用字符串。 我們鍵入strings
、空格、“jibber”,然後按 Enter。
字符串jibber
從文件中提取字符串並在終端窗口中列出。
設置最小字符串長度
默認情況下,字符串將搜索四個字符或更長的字符串。 要設置更長或更短的最小長度,請使用-n
(最小長度)選項。
請注意,最小長度越短,您看到更多垃圾的機會就越大。
一些二進制值具有與表示可打印字符的值相同的數值。 如果其中兩個數值恰好在文件中並排,並且您指定最小長度為兩個,則這些字節將被報告為好像它們是一個字符串。
要要求strings
使用兩個作為最小長度,請使用以下命令。
字符串 -n 2 jibber
我們現在在結果中包含兩個字母的字符串。 請注意,空格被計為可打印字符。
通過更少的管道字符串
由於strings
輸出的長度,我們將通過less
管道輸出。 然後,我們可以滾動文件以查找感興趣的文本。
字符串jibber | 較少的
列表現在以less
的形式呈現給我們,列表頂部首先顯示。
將字符串與目標文件一起使用
通常,程序源代碼文件被編譯成目標文件。 這些與庫文件鏈接以創建二進制可執行文件。 我們手頭有 jibber 目標文件,所以讓我們看一下該文件的內部。 注意“.o”文件擴展名。
jibber.o | 較少的
如果第一組字符串的長度超過八個字符,則它們都將在第 8 列進行換行。 如果它們已被包裝,則“H”字符在第九列中。 您可以將這些字符串識別為 SQL 語句。
滾動輸出顯示該格式並未在整個文件中使用。
有趣的是看到目標文件和完成的可執行文件之間的文本字符串的差異。
在文件的特定區域中搜索
編譯後的程序內部有不同的區域用於存儲文本。 默認情況下, strings
搜索整個文件以查找文本。 這就像您使用了-a
(all) 選項一樣。 要僅在文件中已初始化、加載的數據部分中搜索字符串,請使用-d
(數據)選項。
字符串-d jibber | 較少的
除非您有充分的理由,否則您不妨使用默認設置並蒐索整個文件。
打印字符串偏移量
我們可以讓strings
打印從每個字符串所在文件的開頭開始的偏移量。 為此,請使用-o
(偏移)選項。
字符串-o parse_phrases | 較少的
偏移量以八進制給出。
要以不同的數字基數(例如十進製或十六進制)顯示偏移量,請使用-t
(基數)選項。 radix 選項後面必須跟d
(十進制)、 x
(十六進制)或o
(八進制)。 使用-to
與使用-o
相同。
字符串-td parse_phrases | 較少的
偏移量現在以十進制打印。
字符串-tx parse_phrases | 較少的
偏移量現在以十六進制打印。
包括空格
strings
將製表符和空格字符視為它找到的字符串的一部分。 其他空白字符(例如換行符和回車符)不會被視為字符串的一部分。 -w
(空白)選項使字符串將所有空白字符視為字符串的一部分。
字符串-w add_data | 較少的
我們可以在輸出中看到空白行,這是第二行末尾(不可見)回車和換行符的結果。
我們不限於文件
我們可以將strings
與任何是或可以產生字節流的東西一起使用。
使用此命令,我們可以查看計算機的隨機存取存儲器 (RAM)。
我們需要使用sudo
,因為我們正在訪問 /dev/mem。 這是一個字符設備文件,其中包含計算機主存儲器的圖像。
須藤字符串 /dev/mem | 較少的
該列表不是您的 RAM 的全部內容。 它只是可以從中提取的字符串。
相關: Linux 中的“一切都是文件”是什麼意思?
一次搜索多個文件
通配符可用於選擇要搜索的文件組。 *
字符表示多個字符,而?
character 表示任何單個字符。 您還可以選擇在命令行上提供許多文件名。
我們將使用通配符並蒐索 /bin 目錄中的所有可執行文件。 因為列表將包含來自許多文件的結果,所以我們將使用-f
(文件名)選項。 這將在每行的開頭打印文件名。 然後我們可以看到每個字符串是在哪個文件中找到的。
我們通過 grep 管道傳輸結果,並尋找包含“版權”一詞的字符串。
字符串 -f /bin/* | grep 版權
我們得到了 /bin 目錄中每個文件的版權聲明的簡潔列表,文件的名稱位於每行的開頭。
解開的弦樂
弦樂並不神秘; 這是一個典型的 Linux 命令。 它做了一些非常具體的事情並且做得很好。
它是 Linux 的另一個齒輪,當它與其他命令一起工作時,它真的變得栩栩如生。 當您看到它如何位於二進製文件和其他工具(如grep
)之間時,您就會開始欣賞這個略顯晦澀的命令的功能。
Linux 命令 | ||
文件 | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev ·查看·字符串·類型·重命名· zip ·解壓縮· mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm | |
流程 | 別名· screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat ·超時·牆·是·殺死·睡眠· sudo · su ·時間· groupadd · usermod ·組· lshw ·關機·重新啟動·停止·關機· passwd · lscpu · crontab ·日期· bg · fg | |
聯網 | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw |
相關:適合開發人員和愛好者的最佳 Linux 筆記本電腦