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
时没有响应,查看这个文件,确实不存在,所以我这里就是这个问题了
到这里,知道原因了,剩下的就是安装这个包,然后再试试了。
然后问题解决!!!
总结
这里只是根据个人处理这个问题的经验总结,具体情况具体看,可能还有没碰到的情况,慢慢积累吧,这里就先做个笔记了