如何在 Linux 上使用 strings 命令

已发表: 2022-01-29
笔记本电脑上的 Linux 终端
Fatmawati Achmad Zaenuri/Shutterstock.com

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

Linux 充满了看起来像是寻找问题的解决方案的命令。 strings命令肯定属于那个阵营。 它的目的是什么? 是否有一个命令可以列出二进制文件中的可打印字符串?

让我们后退一步。 二进制文件(例如程序文件)可能包含人类可读的文本字符串。 但是你怎么能看到他们呢? 如果您使用catless ,您可能最终会看到一个挂起的终端窗口。 为处理文本文件而设计的程序如果输入了不可打印的字符,就不能很好地处理它们。

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

因此,试图在二进制文件或数据文件中查看或搜索文本字符串是一个问题。 这就是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 笔记本电脑