Ubuntu下执行可执行二进制文件报文件找不到的错误:No such file or directory

  这个问题之前有碰到,但是没有在意去解决,最近使用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...
	   00     
	   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 时没有响应,查看这个文件,确实不存在,所以我这里就是这个问题了

  

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

  然后问题解决!!!

 

  总结

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

 

posted @ 2024-03-24 15:57  没有星星的夏季  阅读(956)  评论(0编辑  收藏  举报