![如何解决“无法执行二进制文件”的错误?](https://linux22.com/image/1318230/%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E2%80%9C%E6%97%A0%E6%B3%95%E6%89%A7%E8%A1%8C%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6%E2%80%9D%E7%9A%84%E9%94%99%E8%AF%AF%EF%BC%9F.png)
当我使用 SSH 登录时,我所能看到的只有这个……
-bash: /usr/bin/id: cannot execute binary file
-bash: [: : integer expression expected
我在这里什么也做不了。诸如halt
、poweroff
、之类的命令reboot
将返回command not found
。
我该如何解决这个问题?我正在使用 Debian Squeeze Linux
答案1
通常,该错误消息意味着 Linux 无法将该文件识别为 shell 脚本或可执行文件。
通常原因是在错误的架构上运行可执行文件 - 如果您尝试在 ARM CPU 上运行 x86 可执行文件,就会出现此消息。
有/usr/bin/id
可能被覆盖了吗?
答案2
尝试使用 ./executablefilename 来运行它,而不是使用 sh executablefilename。毕竟它不是 shell 脚本。
答案3
问题在于运行针对不同处理器架构的二进制文件。您可以使用 objdump(来自 binutils)检查二进制文件的架构。您可以使用 uname 检查机器的架构。
例如,我在安装 FF.Communicator(chrome 的 Firefox 插件)时遇到了这个错误“无法执行二进制文件”(这样我就可以运行使用 java 小程序的页面)。
对象转储显示二进制文件是 64 位elf64-x86-64
尤纳姆显示我的机器是 32 位i686
$ ./FF.Communicator bash: ./FF.Communicator: cannot execute binary file $ uname -mpio i686 i686 i386 GNU/Linux $ objdump -a ./FF.Communicator ./FF.Communicator: file format elf64-x86-64 ./FF.Communicator
对象转储在我的计算机上运行的二进制文件显示它是 32 位elf32-i386
$ objdump -a /bin/ls /bin/ls: file format elf32-i386
使用这些工具,您可以检查机器和二进制文件的架构 - 不仅仅是英特尔架构,而且是任何处理器。
对于 Mac OSX 用户,您可以使用“file”命令找出特定文件的架构信息:
$ file filename_here
答案4
这意味着您正在尝试使用 bash 脚本执行一个二进制文件,而该文件并非按照您的意图运行。它已经是一个二进制文件,您正在尝试使用 $SHELL 来解析和运行它。
举一个非常简单的例子,如果你尝试运行“w”命令,例如
$ bash w
/usr/bin/w: /usr/bin/w: cannot execute binary file
类似地,您可能会遇到相同的方法,或者从您的代码片段中看到相同的方法。
而对于其余的命令,所有这些 halt、shutdown、reboot 等命令都是 root 拥有的命令,需要超级用户权限才能运行并执行所需的操作。普通用户无法运行它们,另一种解释是这些命令放在 /sbin/ 和 /usr/sbin 中,这可能不在您的 $PATH 变量中(用于验证您保管的命令)