Bash:没有这样的文件或目录?

Kno*_*dge 3 linux binary bash webserver wkhtmltopdf

我尝试在Linux共享网络服务器(Debian,64位)上使用可执行脚本(wkhtmltopdf).我很确定我编译的所有内容都是正确的,但每当我想执行该文件时,我都会得到一个响应:

> ./wkhtmltopdf -H
-bash: ./wkhtmltopdf: No such file or directory
Run Code Online (Sandbox Code Playgroud)

为了确保文件存在,这里是ls输出:

> ls
wkhtmltoimage  wkhtmltopdf
Run Code Online (Sandbox Code Playgroud)

此外,我测试了文件命令,输出以下内容:

> 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
Run Code Online (Sandbox Code Playgroud)

我现在的问题是:

为什么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 .
Run Code Online (Sandbox Code Playgroud)

nsi*_*t22 7

我打赌你错过了动态链接器.做一个

readelf --all ./wkhtmltopdf | grep interpreter
Run Code Online (Sandbox Code Playgroud)

你应该得到这样的输出:

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
Run Code Online (Sandbox Code Playgroud)

您的系统很可能缺少解释器(/lib64/ld-linux-x86-64.so.2在示例中).在这种情况下,bash会大喊大叫No such file or directory,就像二进制文件本身缺失一样.

您可以尝试使用其他链接器.有时你可以成功.做一个:

/path/to/the/linker /path/to/your/executable
Run Code Online (Sandbox Code Playgroud)

这个命令:

find /lib* -name ld-linux\*
Run Code Online (Sandbox Code Playgroud)

将帮助您找到系统上的链接器.或者你可以做readelf的一些命令命令运行.它将向您显示正确的,有效的链接器.

或者,既然您正在运行Debian系统,那就做一个

sudo apt-get install wkhtmltopdf
Run Code Online (Sandbox Code Playgroud)

安装本机版本的工具:)


Pab*_*o A 5

就我而言

$ readelf --all ./wkhtmltopdf | grep interpreter # readelf: Displays information about ELF files.
      [Requesting program interpreter: /lib/ld-linux.so.2]
Run Code Online (Sandbox Code Playgroud)

在可执行文件正在运行的机器上:

$ 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
Run Code Online (Sandbox Code Playgroud)

所以要解决这个问题(参考

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