这个问题之前有碰到,但是没有在意去解决,最近使用Docker部署的时候又出现这个问题,找了一下资料,有了一个解决办法。

比如我们有二进制文件,正常来说它应该是这个样子的,可以执行并输出:

但是现在它报错,找不到文件了:

那么我们一步步来解决

第一步:查看文件是否存在

这个很容易,我们只需要像上面的图片中一样,使用 ls 命令查看一下即可,或者我们使用绝对路径执行试试( 注意文件名不要写错了,比如空格,1和l等 ):

    # 输出查看文件是否存在
    ls ./temp
    # 或者使用绝对路径执行试试
    /temp

如果依赖于 环境变量 ,那么可以输出环境参数,看二进制文件是否存在于环境参数中( echo $PATH ),如果不在,那么可能需要将二进制文件添加到上面的环境参数目录中,或者将二进制文件所在的目录添加到环境变量中。

如果使用了 软链接 ,那么我们还需要查看软链接指向的文件是否存在:

    # 先查看软链接
    ls -l temp
    # 然后查看链接指向的文件是否存在,比如我这里是(/root/temp)
    ls /root/temp

如果是使用了 sudo 命令执行找不到文件,可以参考: 使用sudo执行命令提示command not found

总之,第一步就是要保证能找到文件,显然,我这里是可以找到文件的。

第二步:查看文件是否具有可执行的权限

我们只需要使用 ls -l 命令查看一下即可:

第一列的 -rwxr-xr-x 中的 x 就是可执行权限,我这里有三个 x ,就表示所有用户均具有可执行权限。

如果不是这个样子的,那么就需要添加可执行权限: sudo chmod +x 文件 ,比如我这里就是执行: sudo chmod +x temp

如果文件是 sh 脚本之类的,还可以尝试使用 sh 或者 bash 命令执行试试

显然我这里的二进制文件是可执行的

第三步:确认文件是完整的

通常我们的文件是通过远程传输的形式放上来的,那么可能只传输了一部分,这个时候我们可以比较一下文件的大小,比如我这里的文件大小就是上图的 88422178

另外,我们也可以把文件放到另外一个系统环境下,看能否执行

第四步:确认系统是否支持运行的

我们要确认系统是否支持执行这个二进制文件,比如在windows下执行的二进制文件,在Linux下执行就会报错,或者需要安装相应的包来支持,相信绝大部分人不会犯这个错误。

其次,我们的系统是分32位和64位的,同样,我们的二进制文件也会需要适配,64位的程序在32位系统运行不了,32位程序在64位系统也运行不了,或者需要安装相应的包来支持。

我们可以使用 file 命令和 uname -a 命令来查看程序的信息和系统的版本信息:

    # 如果file命令不存在,那么可以使用apt安装
    sudo apt update
    sudo apt install file
    # 使用file命令查看:file 文件
    file temp
    # 打印系统信息
    uname -a

可以看出我这里的文件是一个64位的ELF可执行文件,适用于GNU/Linux系统,所以系统是可支持执行的。

第五步:查看文件依赖是否完成

可执行文件很多时候都是依赖于一些系统包或者第三方包,这样,我们就需要使用这些包提前正确的安装,执行命令: ldd 文件

可以看到我的依赖包是完整的,如果不完整,那么会提示找不到(not found),那么我们就需要找到对应的包进行安装。

第六步:查看程序头部信息,看是否缺少共享库

我们执行 readelf -l 命令查看即可

    # 如果提示readelf找不到,那么我们还需要安装
    sudo apt update
    sudo apt install binutils
    # 查看程序头部信息:readelf -l 文件
    readelf -l temp

我这里显示的结果大概是这个样子的:

	root@ubuntu:/# readelf -l temp
	Elf file type is DYN (Shared object file)
	Entry point 0x8a7c1
	There are 13 program headers, starting at offset 64
	Program Headers:
	  Type           Offset             VirtAddr           PhysAddr
					 FileSiz            MemSiz              Flags  Align
	  PHDR           0x0000000000000040 0x0000000000000040 0x0000000000000040
					 0x00000000000002d8 0x00000000000002d8  R      0x8
	......
	  LOAD           0x0000000000a4c000 0x0000000000a7e000 0x0000000000a7e000
					 0x00000000000027f8 0x00000000000027f8  RW     0x1000
	  INTERP         0x0000000000a4e7a0 0x0000000000a807a0 0x0000000000a807a0
					 0x0000000000000030 0x0000000000000030  R      0x1
		  [Requesting program interpreter: /snap/core20/current/lib64/ld-linux-x86-64.so.2]
	 Section to Segment mapping:
	  Segment Sections...
	   01     .note.ABI-tag .gnu.hash .dynsym .gnu.version .gnu.version_d .gnu.version_r .rela.dyn .rela.plt 
	   ......
	   12     .interp 
	root@ubuntu:/# apt install binutils

可以看到,正在请求程序解释器 /snap/core20/current/lib64/ld-linux-x86-64.so.2 时没有响应,查看这个文件,确实不存在,所以我这里就是这个问题了

到这里,知道原因了,剩下的就是安装这个包,然后再试试了。

然后 问题解决 !!!

这里只是根据个人处理这个问题的经验总结,具体情况具体看,可能还有没碰到的情况,慢慢积累吧,这里就先做个笔记了