没有这样的文件或目录:无法执行但对 ls、文件和制表符补全可见
No such file or directory: Cannot execute but is visible to ls, file and tab-completion
我正在亚马逊 lightsail 实例上安装 flexnet。我刚刚将内容提取到 /opt
并尝试 运行 任何 lm* 命令。使用 ls
我可以看到我拥有所有权和执行权限。我可以 运行 file
文件夹的任何内容,它会告诉我它是什么。
但是当我尝试执行任何操作时,bash 会抱怨没有这样的文件或目录。示例:
jabozzo@ICUC_services:/opt/flexnet/bin$ ls -all
total 4684
drwxr-xr-x 2 jabozzo jabozzo 4096 Nov 8 2016 .
drwxr-xr-x 6 jabozzo jabozzo 4096 Dec 19 15:46 ..
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmcksum -> lmutil
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmdown -> lmutil
-rwxr-xr-x 1 jabozzo jabozzo 1551536 Nov 8 2016 lmgrd
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmhostid -> lmutil
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmnewlog -> lmutil
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmpath -> lmutil
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmremove -> lmutil
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmreread -> lmutil
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmstat -> lmutil
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmswitchr -> lmutil
-rwxr-xr-x 1 jabozzo jabozzo 1362736 Nov 8 2016 lmutil
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmver -> lmutil
-rwxr-xr-x 1 jabozzo jabozzo 1701200 Nov 8 2016 mgcld
-rwxr-xr-x 1 jabozzo jabozzo 49088 Nov 8 2016 mgls_admin
-rwxr-xr-x 1 jabozzo jabozzo 1593 Nov 8 2016 mgls_child_ver
-rwxr-xr-x 1 jabozzo jabozzo 112736 Nov 8 2016 mgls_ok
jabozzo@ICUC_services:/opt/flexnet/bin$ file lmutil
lmutil: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-lsb-x86-64.so.3, for GNU/Linux 2.6.9, stripped
jabozzo@ICUC_services:/opt/flexnet/bin$ ./lmutil
-bash: ./lmutil: No such file or directory
jabozzo@ICUC_services:/opt/flexnet/bin$ /opt/flexnet/bin/lmutil
-bash: /opt/flexnet/bin/lmutil: No such file or directory
在示例中,如果我键入 ./lmu
并按 Tab 键完成,则完成为 ./lmutils
。使用绝对路径也无济于事。我还检查了是否存在所需的共享库:
jabozzo@ICUC_services:/opt/flexnet/bin$ ldd lmutil
linux-vdso.so.1 => (0x00007ffe09bb1000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7e75ab4000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7e757ab000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f7e75595000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7e751cb000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7e74fc7000)
/lib64/ld-lsb-x86-64.so.3 => /lib64/ld-linux-x86-64.so.2 (0x00007f7e75cd1000)
如果您尝试 运行 一个可执行文件并得到 "no such file or directory" 错误,这通常意味着可执行文件无法找到正确的动态加载程序。如果查看 file
命令的输出,您会看到:
...interpreter /lib64/ld-lsb-x86-64.so.3...
你的系统有/lib64/ld-lsb-x86-64.so.3
吗?如果不是,则表明这些二进制文件是针对不同的体系结构(例如,64 位与 32 位)或针对不同版本的 C 库 (glibc
) 而构建的。
解决方案包括:
安装包含必要解释器的包。
找到一组为您系统上安装的 C 库版本编译的可执行文件。
运行 Docker 容器或 chroot
环境中安装了适当的 C 库的东西。
一个 hacky 解决方案是使用 patchelf 命令来更改嵌入在二进制文件中的解释器路径。根据您的环境,这可能有效,也可能导致一切崩溃。
此外,仅从 .so.2
到 .so.3
的符号链接可能有效。
我正在亚马逊 lightsail 实例上安装 flexnet。我刚刚将内容提取到 /opt
并尝试 运行 任何 lm* 命令。使用 ls
我可以看到我拥有所有权和执行权限。我可以 运行 file
文件夹的任何内容,它会告诉我它是什么。
但是当我尝试执行任何操作时,bash 会抱怨没有这样的文件或目录。示例:
jabozzo@ICUC_services:/opt/flexnet/bin$ ls -all
total 4684
drwxr-xr-x 2 jabozzo jabozzo 4096 Nov 8 2016 .
drwxr-xr-x 6 jabozzo jabozzo 4096 Dec 19 15:46 ..
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmcksum -> lmutil
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmdown -> lmutil
-rwxr-xr-x 1 jabozzo jabozzo 1551536 Nov 8 2016 lmgrd
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmhostid -> lmutil
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmnewlog -> lmutil
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmpath -> lmutil
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmremove -> lmutil
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmreread -> lmutil
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmstat -> lmutil
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmswitchr -> lmutil
-rwxr-xr-x 1 jabozzo jabozzo 1362736 Nov 8 2016 lmutil
lrwxrwxrwx 1 jabozzo jabozzo 6 Dec 14 2016 lmver -> lmutil
-rwxr-xr-x 1 jabozzo jabozzo 1701200 Nov 8 2016 mgcld
-rwxr-xr-x 1 jabozzo jabozzo 49088 Nov 8 2016 mgls_admin
-rwxr-xr-x 1 jabozzo jabozzo 1593 Nov 8 2016 mgls_child_ver
-rwxr-xr-x 1 jabozzo jabozzo 112736 Nov 8 2016 mgls_ok
jabozzo@ICUC_services:/opt/flexnet/bin$ file lmutil
lmutil: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-lsb-x86-64.so.3, for GNU/Linux 2.6.9, stripped
jabozzo@ICUC_services:/opt/flexnet/bin$ ./lmutil
-bash: ./lmutil: No such file or directory
jabozzo@ICUC_services:/opt/flexnet/bin$ /opt/flexnet/bin/lmutil
-bash: /opt/flexnet/bin/lmutil: No such file or directory
在示例中,如果我键入 ./lmu
并按 Tab 键完成,则完成为 ./lmutils
。使用绝对路径也无济于事。我还检查了是否存在所需的共享库:
jabozzo@ICUC_services:/opt/flexnet/bin$ ldd lmutil
linux-vdso.so.1 => (0x00007ffe09bb1000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7e75ab4000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7e757ab000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f7e75595000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7e751cb000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7e74fc7000)
/lib64/ld-lsb-x86-64.so.3 => /lib64/ld-linux-x86-64.so.2 (0x00007f7e75cd1000)
如果您尝试 运行 一个可执行文件并得到 "no such file or directory" 错误,这通常意味着可执行文件无法找到正确的动态加载程序。如果查看 file
命令的输出,您会看到:
...interpreter /lib64/ld-lsb-x86-64.so.3...
你的系统有/lib64/ld-lsb-x86-64.so.3
吗?如果不是,则表明这些二进制文件是针对不同的体系结构(例如,64 位与 32 位)或针对不同版本的 C 库 (glibc
) 而构建的。
解决方案包括:
安装包含必要解释器的包。
找到一组为您系统上安装的 C 库版本编译的可执行文件。
运行 Docker 容器或
chroot
环境中安装了适当的 C 库的东西。
一个 hacky 解决方案是使用 patchelf 命令来更改嵌入在二进制文件中的解释器路径。根据您的环境,这可能有效,也可能导致一切崩溃。
此外,仅从 .so.2
到 .so.3
的符号链接可能有效。