从文件中提取字符串并在终端窗口中列出。
设置最小字符串长度
默认情况下,字符串将搜索四个字符或更长的字符串。要设置更长或更短的最小长度,请使用-n(最小长度)选项。
请注意,最小长度越短,您看到更多垃圾的机会就越高。
某些二进制值与表示可打印字符的值具有相同的数值。如果这些数值中的两个恰好在文件中并排出现,并且您指定的最小长度为两个,则将报告这些字节,就像它们是字符串一样。
要要求字符串使用2作为最小长度,请使用以下命令。
strings -n 2 jibber
现在,我们在结果中包含了两个字母的字符串。请注意,空格被视为可打印字符。
通过更少的管道输送字符串
由于字符串的输出长度较长,我们将通过较少的管道来传递它。然后,我们可以在文件中滚动查找感兴趣的文本。
strings jibber | less
列表现在以LESS显示,列表的顶部首先显示。
将字符串用于对象文件
通常,程序源代码文件被编译成目标文件。这些文件与库文件链接,以创建二进制可执行文件。我们手头有Jibber对象文件,所以让我们来看看该文件的内部。请注意“.o”文件扩展名。
jibber.o | less
如果第一组字符串的长度超过8个字符,则它们全部在第8列换行。如果它们已换行,则第九列中有一个“H”字符。您可能会将这些字符串识别为SQL语句。
滚动浏览输出会发现并未在整个文件中使用此格式。
看到目标文件和完成的可执行文件之间的文本字符串的差异是很有趣的。
在文件中的特定区域中搜索
编译后的程序在自身内部有不同的区域,用于存储文本。默认情况下,字符串搜索整个文件以查找文本。这就好像您使用了-a(All)选项一样。要仅在文件中已初始化、已加载的数据节中搜索字符串,请使用-d(数据)选项。
strings -d jibber | less
除非您有很好的理由,否则您最好使用默认设置并搜索整个文件。
打印字符串偏移量
我们可以让字符串打印从每个字符串所在的文件开始的偏移量。为此,请使用-o(偏移)选项。
strings -o parse_phrases | less
偏移量以八进制给出。
要以不同的数值基数(例如十进制或十六进制)显示偏移,请使用-t(基数)选项。基数选项后面必须跟d(十进制)、x(十六进制)或o(八进制)。使用-to与使用-o相同。
strings -t d parse_phrases | less
现在,偏移量以十进制打印。
strings -t x parse_phrases | less
现在,偏移量以十六进制打印。
包括空格
字符串将制表符和空格字符视为其找到的字符串的一部分。其他空格字符(如换行符和回车符)不会被视为字符串的一部分。-w选项(空格)使字符串将所有空格字符视为字符串的一部分。
strings -w add_data | less
我们可以在输出中看到空行,它是第二行末尾的(不可见)回车符和换行符的结果。
我们并不局限于文件
我们可以将字符串与任何字节流一起使用,或可以生成字节流。
使用此命令,我们可以查看计算机的随机存取存储器(RAM)。
我们需要使用sudo,因为我们正在访问/dev/mem。此文件是一个字符设备文件,其中包含计算机主内存的映像。
sudo strings /dev/mem | less
该列表并不是RAM的全部内容。它只是可以从中提取的字符串。
相关:在Linux中“一切都是文件”是什么意思?
一次搜索多个文件
通配符可用于选择要搜索的文件组。“*”字符表示多个字符,“?”字符表示任何单个字符。您还可以选择在命令行上提供许多文件名。
我们将使用通配符搜索/bin目录中的所有可执行文件。因为清单将包含来自许多文件的结果,所以我们将使用-f(文件名)选项。这将在每行开始处打印文件名。然后,我们可以看到每个字符串是在哪个文件中找到的。
我们通过grep传递结果,并查找包含“版权”一词的字符串。
strings -f /bin/* | grep Copyright
我们得到了/bin目录中每个文件的版权声明的整齐列表,文件名在每行的开头。
解开的字符串
字符串没有什么神秘之处;它是典型的Linux命令。它做了一些非常具体的事情,而且做得非常好。
这是Linux的另一个缺点,当它与其他命令一起工作时,它就会变得活灵活现。当您看到它如何位于二进制文件和其他工具(如grep)之间时,您会开始欣赏这个稍显晦涩的命令的功能。