【问题标题】:Bash: No such file or directory?Bash:没有这样的文件或目录?
【发布时间】:2016-05-06 10:35:55
【问题描述】:

我尝试在 Linux 共享网络服务器(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”选项挂载的,你会得到一个“权限被拒绝”。
  • 权限是什么?
  • 添加到您的问题输出中:idls -l wkhtmltopdf
  • 看起来不错,那么您在 curr_dir 和 parent_dir 上看到的烫发呢,即。 ls -ld . .. 。祝你好运。
  • 尝试重新启动该 bash 实例。

标签: linux bash binary webserver wkhtmltopdf


【解决方案1】:

我打赌你想念动态链接器。做一个

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

安装本机版本的工具:)

【讨论】:

  • 输出和你说的完全一样。我现在如何明确检查/lib64/ld-linux-x86-64.so.2是否存在?
  • 发出ls -l /lib64/ld-linux-x86-64.so.2。将其输出粘贴到此处。
  • ls 输出是:ls: cannot access /lib64/ld-linux-x86-64.so.2: No such file or directory 所以谢谢 :)
  • 是的,有一秒钟我停止思考:D
  • 我更新了我的答案,如果二进制文件未与外来库链接,您如何“覆盖”问题。
【解决方案2】:

就我而言

$ 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)

【讨论】:

    【解决方案3】:

    缺少链接器也是我的情况。我可以在这样的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 2020-07-16
      • 2021-08-12
      相关资源
      最近更新 更多