打开/读取 Unix 可执行文件

打开/读取 Unix 可执行文件

是否有一种本地方式(无需安装或下载额外的东西)来读取 Unix 可执行文件?我只需要阅读文件来查看其中的内容并了解我可以使用它做什么。

我真正想做的是了解无线诊断应用程序的作用,或者更确切地说如何它做到了。我正在寻找为我的 Mac 构建自己的网络诊断应用程序。因此,我想阅读无线诊断应用程序(位置:/System/Library/CoreServices/Applications/Wireless Diagnostics.app)的内容,因此我在应用程序中找到了可执行文件,看看是否可以收集任何内容。这就是我想要摆脱的。

答案1

如果我们讨论的是可以在 shell 提示符下运行的命令,则应该有一个手册页:

$ man someprogram

如果你返回类似的内容No manual entry for foo,你可以尝试使用 GNU info

$ info someprogram

并非所有 Unix 和类 Unix 操作系统都有 GNU 信息,但很多都有,而且它通常比经典man页面提供更多有关给定命令的信息。

如果您确实有info并且它不知道该命令,您将看到类似No menu item 'someprogram' in node '(dir)Top'屏幕底部的内容。按Q离开info

在此类系统上,程序通常由某个包管理器拥有,您也可以向包管理器询问该程序。举例来说,我们会说您对 感兴趣someprogram,并且您正在使用带有该命令的 shell which。如果后者不可用,您可以手动提供可执行文件的路径,例如/usr/bin/someprogram.

基于 RPM 的 Linux(RHEL、Fedora、CentOS...)

首先找出该程序属于哪个包:

$ rpm -qf `which someprogram`
somepackage-1.2.3-4

然后向 RPM 询问该软件包:

$ rpm -qi somepackage
Name      : somepackage
Version   : 1.2.3
Release   : 4
...etc...

基于 DEB 的 Linux(Debian、Ubuntu、Mint...)

该模式与 RPM 相同。首先,找出谁拥有该文件:

$ dpkg -S `which someprogram`
somepackage: /usr/bin/someprogram

然后询问包裹本身:

$ dpkg -s somepackage
Package: somepackage
Essential: no
Status: install ok installed
...etc...

Mac OS X

“本机”OS X 包管理器在某种程度上是一个隐藏的操作系统功能,它并不能用于所有用途,但值得一试。模式与上面相同:

$ pkgutil --file-info `which someprogram`
volume: /
path: /usr/bin/someprogram
pkgid: com.example.bundles.somepackage
pkg-version: 1.2.3
...etc...

然后获取更多信息somepackage

$ pkgutil --pkg-info com.example.bundles.somepackage
$ pkgutil --files com.example.bundles.somepackage
...etc...

如果您安装了第三方包管理器之一(自制,Mac端口, 或者芬克)有类似的命令来获取有关它们拥有的包的信息。

如果您正在处理安装在任何这些系统之外的程序,您可能正在处理一个 GUI 程序,它很乐意使用内部机制告诉您有关其自身的所有信息。 (关于框、帮助等)

自由BSD

传统上,BSD 没有使用正式的包管理器,但在过去的几年里,FreeBSD 已经慢慢转向使用pkg,又名 PkgNG。

它也与上述系统具有相同的使用模式:

$ pkg which `which someprogram`
/usr/bin/someprogram was installed by package somepackage-1.2.3-4
$ pkg info somepackage
somepackage-1.2.3-4
Name :           somepackage
Version :        1.2.3-4
...etc...

也许有一天,安装在 FreeBSD 机器上的绝大多数程序将通过安装pkg,但不是今天。

如果您通过以下方式安装了程序港口,并且您可以找出哪个端口安装了它,您可能可以通过以下方式获得您想要的东西:

 $ cd /usr/ports
 $ ls -d */somepackage
 net/somepackage
 $ cat net/somepackage/pkg-descr

答案2

od -tx1 somefile | less允许您浏览文件的二进制(好吧,十六进制)转储。它告诉您文件中的内容,但当然不是以普通人可读的语言。通常,人类无法读取二进制可执行文件。大多数人甚至无法阅读脚本。

您可以通过以下几种方式从可执行文件中获取信息:

  • file myprogram告诉您它是什么类型的文件,例如它适用于什么类型的机器。
  • ./myprogram --help可能会向您显示一些使用信息。但这是程序作者可能遵守也可能不遵守的约定,而不是义务。如果./myprogram --help抱怨这--help不是一个有效的选项,它可能会建议其他内容,例如./myprogram -h./myprogram -help./myprogram -?或不带参数运行程序。
  • ldd myprogram,对于动态链接的可执行文件,告诉您它加载的库。
  • strings myprogram列出文件中由 ASCII 可打印字符组成的所有位。并非所有这些都是有意义的,因为文件中没有任何内容可以区分有意义的字符串和恰好是可打印字符的字节序列。
  • objdump -d myprogram反汇编可执行文件,或者至少尝试反汇编。

确实,没有什么神奇的方法可以获取您似乎期望的信息。它只是不存在(除非myprogram --help在这种特殊情况下的输出满足您的要求)。可执行文件旨在由计算机而不是人类读取。

相关内容