可执行文件位于当前目录中,但无法运行

时间:2015-09-17 20:37:21

标签: linux bash unix ubuntu

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

kiarashsadr@pandoras-box:~/Downloads/Tether/linux$ ls
adb  run.sh

kiarashsadr@pandoras-box:~/Downloads/Tether/linux$ ls -l
total 1204
-rwxrwxr-x 1 kiarashsadr kiarashsadr 1226659 Mar  9  2013 adb
-rwxrwxr-x 1 kiarashsadr kiarashsadr     521 Oct 29  2012 run.sh

kiarashsadr@pandoras-box:~/Downloads/Tether/linux$ ./adb
bash: ./adb: No such file or directory

来自file的输出:

kiarashsadr@pandoras-box:~/Downloads/Tether/linux$ file adb
adb: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped

WUT ??

2 个答案:

答案 0 :(得分:4)

您正尝试在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

答案 1 :(得分:1)

正如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 #

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

尝试

ls -la | hexdump -C

验证名称确实应该是它应该是什么。