最初是在虚拟机搭建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
激活文件
测试成功!!!!