【问题标题】:Executable is in current directory but can't be run [duplicate]可执行文件在当前目录中但无法运行[重复]
【发布时间】:2015-12-14 20:48:28
【问题描述】:

我遇到了一个奇怪的问题,我在目录中有一个可执行文件,但是当我尝试运行它时,bash 说它不存在:

kiarashsadr@pandoras-box:~/Downloads/Tether/linux$ ls 亚行运行.sh kiarashsadr@pandoras-box:~/Downloads/Tether/linux$ ls -l 总计 1204 -rwxrwxr-x 1 kiarashsadr kiarashsadr 1226659 2013 年 3 月 9 日亚行 -rwxrwxr-x 1 kiarashsadr kiarashsadr 521 2012 年 10 月 29 日 run.sh kiarashsadr@pandoras-box:~/Downloads/Tether/linux$ ./adb bash: ./adb: 没有这样的文件或目录

file的输出:

kiarashsadr@pandoras-box:~/Downloads/Tether/linux$ 文件 adb adb:ELF 32 位 LSB 可执行文件,Intel 80386,版本 1 (SYSV),动态链接(使用共享库),用于 GNU/Linux 2.6.8,未剥离

wut??

【问题讨论】:

  • 显示ls -l 输出。也许名称中有一个有趣的字符?b 也许显示文件的前 3 行左右 - 如果有 shebang 行并且格式错误,您可以得到它,因为找不到命令解释器。
  • 您的 adb 是 1.2 MiB 脚本?还是可执行程序?脚本是文本文件。看起来它可能是一个可执行文件。如果是这样,你从file ./adb /bin/sh 得到什么?它们是同一类型吗?
  • 我似乎记得当加载程序找不到可执行文件引用的动态库时会弹出此错误。这可能吗?
  • 这个问题的答案unix.stackexchange.com/questions/120015/… 展示了如何获取引用库的列表。
  • 您是否尝试在 64 位系统上运行 32 位程序?

标签: linux bash unix ubuntu


【解决方案1】:

您正在尝试在 64 位系统上运行 32 位可执行文件。 Bash 不区分这种情况和“没有这样的文件或目录”情况。

更多关于这个话题:Executing 32 bit code under Ubundu 64 bit installation error- No such file or directory

更多关于如何在 64 位系统上运行 32 位可执行文件:https://askubuntu.com/questions/454253/how-to-run-32-bit-app-in-ubuntu-64-bit

【讨论】:

  • 我可以确认您在这种情况下得到的错误正是“没有这样的文件或目录”,就好像该文件不存在一样。
【解决方案2】:

正如 VOR73X 所说,这种情况下的原因是该文件是 64 位架构上的 32 位可执行文件。您可以运行它,但您需要一个兼容层来执行此操作。如果你有它:

mintaka:/home/lserni # file ansi
ansi: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, not stripped
mintaka:/home/lserni # uname -a
Linux mintaka 4.0.1-1-default #1 SMP Wed Apr 29 15:04:53 UTC 2015 (e3a374a) x86_64 x86_64 x86_64 GNU/Linux
mintaka:/home/lserni # ./ansi
Syntax: ansi [file|-]

...否则你会得到“没有这样的文件或目录”。

但是,可能还有其他原因导致无法运行“似乎”存在(甚至)的文件。

缺少动态库会产生明显的错误(至少在我的系统 Linux OpenSuSE 13.2 上会这样):

./test: error while loading shared libraries: libcap.so.2: cannot open shared object file: No such file or directory

另一种可能性...

...是文件没有像您想象的那样命名。您要的文件真的不存在!

例如(使用与以前相同的过时文件)

mintaka:/home/lserni # mv ansi 'ansi '
mintaka:/home/lserni # ls -la ansi*
-rwxr-xr-x 1 root root 14268 Sep 17 23:29 ansi

文件似乎在那里但它的名称现在以空格结尾,所以正如您所期望的......

mintaka:/home/lserni # ./ansi
bash: ./ansi: No such file or directory

当然如果文件调用正确,转义空格...

mintaka:/home/lserni # ./ansi\
Syntax: ansi [file|-]
mintaka:/home/lserni #

其他技巧是可能的(我曾经错误地对自己做过一次,并且看到一些蠕虫使用这个技巧来躲避随意的“ls”)。例如 UTF8 不可见字符。

试试

ls -la | hexdump -C

验证名称确实是它应有的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    相关资源
    最近更新 更多