我尝试在Linux共享网络服务器(Debian,64位)上使用可执行脚本(wkhtmltopdf)。我很确定我编译的所有内容都是正确的,但每当我想执行文件时,我都会得到一个回复:
> ./wkhtmltopdf -H
-bash: ./wkhtmltopdf: No such file or directory
为了确保文件存在,这里是ls输出:
> ls
wkhtmltoimage wkhtmltopdf
此外,我测试了文件命令,输出以下内容:
> 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 .
答案 0 :(得分:5)
我打赌你错过动态链接器。做一个
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
命令。它将向您显示正确的,有效的链接器。
OR ,因为您正在运行Debian系统,只需执行
sudo apt-get install wkhtmltopdf
安装该工具的原生版本:)
答案 1 :(得分:0)
就我而言
$ readelf --all ./wkhtmltopdf | grep interpreter
[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
所以要解决此问题(reference)
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install libc6:i386 # GNU C Library: Shared libraries (from apt show)