sshpass 命令踩坑记录--未获取环境变量

本文记录了一次因环境变量问题导致的Java命令找不到的故障排查过程。在移除预装OpenJdk后,流水线执行时出现错误。通过对比不同登录方式的环境变量,发现sshpass在非交互式登录时无法获取完整路径。解决方案是通过软链接确保Java命令在/usr/bin/下可用,从而避免依赖环境变量。文章强调了环境变量对Java版本的影响,建议在脚本中直接指定Java命令的完整路径,以防止类似问题。
摘要由CSDN通过智能技术生成

sshpass 命令踩坑记录–未获取环境变量

近日,由于某个厂商的安全流量分析的探针导致了java进程假死,在使用jstack命令却报虚拟机版本不匹配的问题。几番查询,发现未使用该用户配置在.bash_profile下的java环境变量。而是操作系统预装的openJdk。

不执行用户目录下.bash_profile

因此,通过root用户 yum 删除了openJdk。然引起了gitee企业版流水线执行主机部署阶段报出异常 java命令找不到。

不执行/etc/profile

接着,通过root用户在/etc/profile中配置了java环境变量。然流水线仍然报错,java命令找不到。

对比预装openJdk

通过 whereis java命令,对比了其他还保留预装openJdk的机器,发现java命令的位置在/usr/bin/下。

建立软链接

通过 **ln -s 被链接的源文件 链接文件**的方式将java命令链接为/usr/bin/java。之后流水线就正常运行了。

三者对比

通过个人电脑,对三种情况(root/个人用户/sshpass)进行了比较,得到如下结果:

wanglh@dark:~$ su - root
请输入密码:
验证成功
root@dark:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
root@dark:~# exit
注销
wanglh@dark:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin:/snap/bin
wanglh@dark:~$ sshpass -p 密码 ssh -o 'StrictHostKeyChecking=no' wanglh@127.0.0.1 'echo $PATH'
/usr/local/bin:/usr/bin:/bin:/usr/games

环境变量果然是sshpass得到的最少。

登录方式的不同

linux 登录分 交互式登录、非交互式登录。我们正常登录终端是交互式登录,使用脚本去执行就是非交互式登录。

例如我们在切换用户时使用的su - usernamesu username即是不同的方式,带着“-”符号的为交互式的方式登录,会清空当前的环境变量,并去执行初始化脚本。而后者则是继承当前的环境变量。

可参考https://blog.csdn.net/gui951753/article/details/79154496

总结

java命令会受到环境变量的影响,使用了其他版本的jdk。最好,环境中只存在一个java环境。

另外,该厂商给出意见,对于流水线中的脚本,可以指明java命令的绝对路径,防止此类问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值