关于ssh远程执行命令出现xxx: command not found问题

博主在搭建Hadoop 3.x集群时遇到jps命令无法在ssh远程执行的问题,通过深入理解bash的非交互式shell模式发现环境变量未被正确加载。解决方案是在~/.bashrc中添加JAVA_HOME和PATH变量,并确保在非交互模式下也能生效。
摘要由CSDN通过智能技术生成

最初是在虚拟机搭建Hadoop3.x集群,使用命令ssh hadoop001 jps,出现:

bash: jps: command not found

但是单独测试jps命令和先ssh登录再测试jps命令都是可行的。
这说明配置的 /etc/profile文件中的环境变量是有效的,
对ssh远程执行命令这种方式是无效的,profile文件没有调用到。
于是通过技术文章了解ssh远程执行命令的原理。
https://blog.csdn.net/whitehack/article/details/51705889


了解到ssh 远程执行命令采用bash的non-interactive + non-login shell模式。这种模式下,bash没有登录启动,然后创建一个shell,执行完脚本或命令就退出,不与用户交互。它不会调用/etc/profile文件,而是会去调用用户的home目录下的.bashrc文件,即~/.bashrc。从两个文件开头也可以看出:
在这里插入图片描述
于是解决思路就是在~/.bashrc文件中加入对应的环境变量:

export JAVA_HOME=/home/ubuntu/module/jdk
export PATH=$PATH:$JAVA_HOME/bin

然后我把环境变量添加在.bashrc文件最后,保存:
在这里插入图片描述
但是!!!ssh远程命令反馈依然是jps: command not found,我逐一检查,重复看文章,多次测试,无一成功,真是哭死。甚至想要使用ln软链接将jps链接到/usr/local/bin,但这种方式治标不治本。而多次探索中我无意中看到.bashrc文件开头:
在这里插入图片描述
意思是如果不是运行交互式,就不做任何事情,而ssh远程命令就是非交互式,会不会执行完这段就退出了呢?于是我又测试,在这段代码前后都加入输出代码:
在这里插入图片描述
结果如我所料:
在这里插入图片描述
最终得出解决方案:在~/.bashrc文件中# If not running interactively, don't do anything这段话前面加入环境变量。
在这里插入图片描述
再执行命令source ~/.bashrc激活文件

测试成功!!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值