Bash: 没有这个文件或目录?

12

我试图在一个Linux共享web服务器上(Debian,64位)使用可执行脚本(wkhtmltopdf)。我相当确定我编译了所有正确的东西,但每当我想要执行该文件时,我都会得到以下响应:

> ./wkhtmltopdf -H
-bash: ./wkhtmltopdf: No such file or directory

为了确定文件是否存在,这里是ls命令的输出:

> ls
wkhtmltoimage  wkhtmltopdf

此外,我对其进行了file命令测试,输出如下:

> file wkhtmltopdf
wkhtmltopdf: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
我的问题是:
为什么Bash告诉我没有“文件或目录”,而实际上有一个?
我的第一个猜测是共享服务器不允许执行二进制文件?但如果是权限问题,那不应该会有另一种Bash输出吗?
编辑:
> id 
uid=2725674(p8907906) gid=600(ftpusers) groups=600(ftpusers)

> ls -l wkhtmltopdf
-rwxrwxrwx 1 p8907906 ftpusers 39745960 Jan 20 09:33 wkhtmltopdf

> ls -ld
drwx---r-x 2 p8907906 ftpusers 44 Jan 28 21:02 .

如果您的文件系统已使用“noexec”选项挂载,则会收到“权限被拒绝”的错误提示。 - Cyrus
什么是权限? - tadamhicks
请在您的问题输出中添加以下内容:idls -l wkhtmltopdf - Cyrus
看起来没问题,那你当前目录和父级目录的权限是怎样的呢?例如,ls -ld . ..。祝你好运! - shellter
尝试重新启动该 bash 实例。 - Brandon Dyer
感谢所有的输入:)。我认为我真正缺少的是@nsilent22提供的解释器。 - DrDirk
4个回答

24

我敢打赌你想念 动态链接器。只需要执行

readelf --all ./wkhtmltopdf | grep interpreter

你应该得到这样的输出:
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

你的系统很可能缺少解释器(例如:/lib64/ld-linux-x86-64.so.2)。在这种情况下,bash 会报错 No such file or directory,就像二进制文件本身丢失一样。

你可以尝试使用不同的链接器。有时候你会成功。只需执行以下命令:

/path/to/the/linker /path/to/your/executable

这个命令:

find /lib* -name ld-linux\*

这将帮助您找到系统上的链接器。或者您可以在某些运行的命令上执行readelf命令。它将显示正确的工作链接器。

或者,由于您正在运行Debian系统,只需执行

sudo apt-get install wkhtmltopdf

安装工具的本地版本 :)


1
执行 ls -l /lib64/ld-linux-x86-64.so.2 命令,将其输出粘贴在此处。 - nsilent22
ls 命令的输出为:ls: 无法访问 /lib64/ld-linux-x86-64.so.2: 没有那个文件或目录,谢谢 :) - DrDirk
1
我更新了我的答案,告诉您如何“覆盖”该问题,如果二进制文件没有链接到外部库。 - nsilent22
“> uname -m” 输出: “x86_64”,那么我猜我正在运行一个64位系统? - DrDirk
@知识:看起来是这样。因此,如果您没有管理员权限,可以尝试手动下载软件包(例如从这里:https://packages.debian.org/jessie/amd64/wkhtmltopdf/download),然后手动解压缩它,就会得到二进制文件。但看起来它依赖于许多其他库(例如Qt5),所以我认为这并不值得尝试。 - nsilent22
显示剩余5条评论

5
在我的情况下
$ readelf --all ./wkhtmltopdf | grep interpreter # readelf: Displays information about ELF files.
      [Requesting program interpreter: /lib/ld-linux.so.2]

在一个可执行文件正常运行的计算机上:

$ ls -lah /lib/ld-linux.so.2
lrwxrwxrwx 1 root root 25 Apr 16  2018 /lib/ld-linux.so.2 -> i386-linux-gnu/ld-2.27.so
$ dpkg -S /lib/ld-linux.so.2  # -S, --search filename-search-pattern: Search for a filename from installed packages.
libc6:i386: /lib/ld-linux.so.2

因此,为了解决这个问题(参考资料),需要进行以下步骤:

sudo dpkg --add-architecture i386
sudo apt update
sudo apt install libc6:i386  # GNU C Library: Shared libraries (from apt show)

2

我也遇到了缺少链接器的情况。根据nsilent22的回答,我可以像这样解决它:

readelf --all  /usr/local/myprogram | grep interpreter
[Requesting program interpreter: /lib64/ld-lsb-x86-64.so.3]

但是那个链接器已经不存在了。

/lib64 的旧情况是:

ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.31.so
ld-linux-x86-64.so.3 -> ld-linux-x86-64.so.2

所以,结果证明这只是系统链接器的符号链接。
转到/lib64,它本身是指向usr/lib64的符号链接,并在那里创建符号链接没有起作用。我认为,在Debian将所有内容移动到/usr后,存在太多象征性链接级别。
然而,创建一个“直接”的符号链接。
ln -s /usr/lib64/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3

任务已完成;/usr/lib64现在显示:

ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.31.so
ld-lsb-x86-64.so.3 -> /usr/lib64/ld-linux-x86-64.so.2

-1

我在我的树莓派4上遇到了这个问题,它运行的是aarch64 alpine 3.13。使用@vkersten提供的答案,我能够确定我缺少了/lib/ld-linux-aarch64.so.1。

我通过安装gcompat并使用apk add gcompat解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接