如何在Linux上使用字符串命令

想要查看二进制文件或数据文件中的文本吗?Linux string命令会为您拉出那些称为“字符串”的文本。

Linux充满了搜索问题的命令,这些命令看起来像是解决方案。弦乐命令绝对属于这一阵营。它的目的究竟是什么呢?是否指向从二进制文件中列出可打印字符串的命令?

让我们后退一步。二进制文件--比如程序文件--可能包含人类可读的文本字符串。但是你怎么才能看到它们呢?如果您使用CAT或更少的内容,您很可能最终得到一个悬挂的终端窗口。如果无法打印的字符通过文本文件输入,则设计用于处理文本文件的程序不能很好地处理这些文件。

二进制文件中的大多数字节是人类不可读的,并且不能以任何有意义的方式打印到终端窗口。没有字符或标准符号表示与字母数字字符、标点符号或空格不对应的二进制值。这些字符统称为“可打印”字符。其余的是“不可打印”的字符。

因此,试图在二进制或数据文件中查看或搜索文本字符串是一个问题。这就是弦的用武之地。它从文件中提取可打印字符的字符串,以便其他命令可以使用这些字符串,而不必处理不可打印的字符。

使用字符串命令

字符串命令并不复杂,其基本用法也非常简单。我们在命令行上提供要搜索的字符串的文件名。

这里,我们将对名为“jibber”的二进制文件(可执行文件)使用字符串。我们键入字符串、空格、“jibber”,然后按Enter键。

strings jibber

从文件中提取字符串并在终端窗口中列出。

设置最小字符串长度

默认情况下,字符串将搜索四个字符或更长的字符串。要设置更长或更短的最小长度,请使用-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)之间时,您会开始欣赏这个稍显晦涩的命令的功能。

相关文章