博客主页:https://tomcat.blog.csdn.net
博主昵称:农民工老王
主要领域:Java、Linux、K8S
期待大家的关注💖点赞👍收藏⭐留言💬
目录
- 故障详情
- 问题原因
- 解决方案
- 命令使用全路径
- 修改~/.bashrc
故障详情
最近收到测试同事的反馈,在通过ssh远程执行命令是遇到“未找到命令”的报错。如下图所示:
单独远程执行lsof命令也报错。
但远程服务器的lsof命令是正常的,直接在远程服务器中运行第一张图片中的命令也没有任何报错。
问题原因
造成这个问题是因为bash有四种模式,分别是 interactive + login shell 、 interactive + non-login shell、 non-interactive + login shell、 non-interactive + non-login shell。而通过ssh远程执行命令时,采用的是non-interactive + non-login shell模式。这种情况下,bash无交互未登录,执行命令时不会调用/etc/profile
,而是只会执行用户家目录下的.bashrc,也就是~/.bashrc
。而PATH信息一般存储在/etc/profile。只加载~/.bashrc
就会缺失PATH变量的设置。
解决方案
根据问题产生原因,有以下两种解决方案:
命令使用全路径
通过全路径方式调用可以避开PATH找不到的问题。
如果不知道目标命令的绝对路径,可以通过whereis
查看,如whereis lsof
。
如果报错来自脚本中的命令,就需要修改脚本文件。所以这种方法有一些局限性。
修改~/.bashrc
既然~/.bashrc
缺少PATH信息,那我们在该文件中新增PATH信息就解决问题了。
在远程服务器上运行echo -e "\nexport PATH=$PATH" >> .bashrc
可将PATH信息写入~/.bashrc
。
如需转载,请注明本文的出处:农民工老王的CSDN博客https://blog.csdn.net/monarch91 。