尝试在终端上运行可执行文件(我使用的是 Tails live OS),但我不断收到错误消息。我已经设置了权限。我写的命令:
sudo ./home/amnesia/myfile
我收到“命令未找到”?
我尝试使用或不使用 sudo 运行它:
$ sudo /home/amnesia/myfile
sudo: unable to execute /home/amnesia/myfile: No such file or directory
$ /home/amnesia/myfile
bash: /home/amnesia/myfile: No such file or directory
有关文件的信息(它是二进制文件,而不是脚本):
$ ls -l /home/amnesia/myfile
-rwxrwxrwx 1 amnesia amnesia 15327 Sep 3 2013 /home/amnesia/myfile
$ file /home/amnesia/myfile
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared lies), for GNU/Linux 2.6.9, not stripped
有关我的系统的信息:
$ uname -a
Linux amnesia 3.16-3-amd64 #1 SMP Debian 3.16.5-1 (2014-10-10) x86_64 GNU/Linux
$ file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0xd3280633faaabf56a14a26693d2f810a32222e51, stripped
答案1
$ /home/amnesia/myfile
bash: /home/amnesia/myfile: No such file or directory
$ file /home/amnesia/myfile
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared lies), for GNU/Linux 2.6.9, not stripped
确实myfile
存在,但运行它时会显示“没有这样的文件或目录”的消息。这种情况发生在以下情况下:
- 该文件依赖于加载程序 - 它是动态链接的可执行文件,并且需要加载程序来加载动态链接库。 (加载器也可以是由 shebang 行指定的解释器,但 bash 会检测到这种情况并给出不同的错误消息。)
- 加载程序文件不存在。
“没有这样的文件或目录”消息实际上与加载程序有关,但 shell 不知道涉及加载程序,因此它报告原始文件的名称。我在中更详细地解释了这一点Optware 安装的二进制文件中显示“没有这样的文件或目录”。
为什么不能运行这个程序?因为您没有 64 位可执行文件的动态加载程序。
$ uname -a
Linux amnesia 3.16-3-amd64 #1 SMP Debian 3.16.5-1 (2014-10-10) x86_64 GNU/Linux
$ file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0xd3280633faaabf56a14a26693d2f810a32222e51, stripped
您的系统具有 64 位内核,但系统的其余部分是 32 位。 Linux支持这种配置(64位内核可以运行64位程序和32位程序,但32位内核只能运行32位程序)。内核可以很好地加载程序;您将能够运行静态链接的 amd64 可执行文件。但是,您没有 64 位加载程序 ( /lib64/ld-linux-x86-64.so.2
),也可能没有任何 64 位库。因此您无法运行动态链接的 amd64 可执行文件。
为什么要运行 64 位内核和 32 位用户区?
- 要使用大约3GB以上的物理内存。 (这不是唯一的方法 - 另一种可能性是运行支持 PAE 的 32 位内核。)
- 能够运行 64 位二进制文件,例如通过在实时操作系统上启动,然后在某处 chroot 到已安装的 64 位系统。
- 为了减少发行版的维护工作:为最新的硬件提供单个内核,并将其设为 64 位。
- 运行 64 位虚拟机(某些 VM 引擎需要 64 位内核才能运行 64 位 VM)。
我不认为 Tails 提供 64 位系统。您应该获得 32 位版本的可执行文件。如果不能,请使用其他发行版(可能在虚拟机中)。
答案2
如果你还没有:chmod
chmod u+x /home/amnesia/myfile
并删除“.”从一开始。当您位于文件所在的同一目录中时需要它
sudo /home/amnesia/myfile
这是演示:
答案3
我建议检查以下内容:
- 跑步
file /home/amnesia/myfile
。这将确定您尝试执行的文件类型; - 运行脚本没有
sudo
获得更有意义的信息; - 如果它类似于 shell 脚本,a
set -x
也会帮助您弄清楚发生了什么。您还可以使用sh -x
;运行脚本 - 可能是 Shebang 线断了(例如:糟糕的解释器)。粘贴
head -5 /home/amnesia/myfile
;的输出 - 可能是您的脚本中有“DOS”换行符。如果该文件是一个带有 DOS 换行符的脚本,一个简单的
dos2unix myfile
或perl -pi -e 's/\r\n/\n/g' input.file
可以解决问题;
答案4
我有同样的问题。在 Debian 7.8 上,修复方法是安装该lsb
软件包:
apt-get install lsb
我必须在 CentOS 上安装一个类似的软件包(不记得具体是哪个)。