Bash: 没有那个文件或目录?
Bash: No such file or directory?
我尝试在 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却告诉我没有'file or directory'?
我的第一个猜测是共享服务器不允许执行二进制文件?但这不应该是权限问题,具有不同的 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 .
我打赌你错过了 动态链接器。就做一个
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
命令。它将向您显示正确的工作链接器。
或,既然你是运行ning Debian系统,就做一个
sudo apt-get install wkhtmltopdf
安装本机版本的工具:)
就我而言
$ 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
所以要解决问题 (reference)
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install libc6:i386 # GNU C Library: Shared libraries (from apt show)
错过 linker 也是我的情况。我可以在 nsilent22 的帮助下修复它,如下所示:
readelf --all /usr/local/myprogram | grep interpreter
[Requesting program interpreter: /lib64/ld-lsb-x86-64.so.3]
但是那个link儿已经不存在了。
/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
原来这只是系统linker 的符号link。
移至 /lib64
,它本身是 usr/lib64
的 symlink 并在那里创建 symlink 无效。我假设在 Debian 将所有内容移动到 /usr
之后,有很多符号 link 级别
但是创建一个 'direct' symlink
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
我 运行 在我的 raspberry pi 4 运行 aarch64 alpine 3.13 上解决了这个问题。使用@vkersten 提供的答案,我能够确定我丢失了 /lib/ld-linux-aarch64.so.1.
我通过 apk add gcompat
安装 gcompat 解决了这个问题。
我尝试在 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却告诉我没有'file or directory'?
我的第一个猜测是共享服务器不允许执行二进制文件?但这不应该是权限问题,具有不同的 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 .
我打赌你错过了 动态链接器。就做一个
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
命令。它将向您显示正确的工作链接器。
或,既然你是运行ning Debian系统,就做一个
sudo apt-get install wkhtmltopdf
安装本机版本的工具:)
就我而言
$ 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
所以要解决问题 (reference)
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install libc6:i386 # GNU C Library: Shared libraries (from apt show)
错过 linker 也是我的情况。我可以在 nsilent22 的帮助下修复它,如下所示:
readelf --all /usr/local/myprogram | grep interpreter
[Requesting program interpreter: /lib64/ld-lsb-x86-64.so.3]
但是那个link儿已经不存在了。
/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
原来这只是系统linker 的符号link。
移至 /lib64
,它本身是 usr/lib64
的 symlink 并在那里创建 symlink 无效。我假设在 Debian 将所有内容移动到 /usr
但是创建一个 'direct' symlink
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
我 运行 在我的 raspberry pi 4 运行 aarch64 alpine 3.13 上解决了这个问题。使用@vkersten 提供的答案,我能够确定我丢失了 /lib/ld-linux-aarch64.so.1.
我通过 apk add gcompat
安装 gcompat 解决了这个问题。