Linux-两种ssh远程执行命令方式加载环境变量区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux-两种ssh远程执行命令方式加载环境变量区别相关的知识,希望对你有一定的参考价值。

参考技术A 最近在编写脚本的时候发现一个问题,在执行 kubectl -n kube-system get pods 这个命令的时候,通过 ssh root@ip command 和 ssh root@ip command 登录后执行得到了不同的结果,

从上面可以看到SSH远程执行获取pods失败了,但是shell窗口执行却成功了,所以我们可以猜到两者之间一定有什么区别导致结果的不同。那么区别在哪里呢?通过研究发现两者的环境变量存在区别,通过执行printenv可以查看所有设置的环境变量:

通过上面可以看到SSH远程执行的时候是没有KUBECONFIG这个环境变量,而Shell窗口是有的,为什么有这个区别呢?这就要从Linux的bash的四种模式说起。
bash的四种模式:

从上面可以看出不同方式下加载的配置文件不同,那么怎么知道我们是加载了那些配置文件呢? 这里有一个验证的方法,就是在上面的每个配置文件中添加一句 echo $/etc/profile 这样的命令,把每个文件的路径打印出来。当配置文件被加载时,会输出相应的文件名,本例中在两个文件中加了该命令:/etc/pfoile, ~/.bashrc,然后使用不同SSH方式执行命令的结果如下。

只加载了.bashrc文件,未加载/etc/profile。

从输出可以看到两个配置都加载了,而KUBECONFIG只定义在/etc/profile中,没有定义在.bashrc文件中,所以通过 ssh root@ip command 执行时没有拿到KUBECONFIG这个环境变量从而导致报错。知道原因后我们就可以将KUBECONFIG环境变量添加到.bashrc文件即可。

shell脚本ansible执行不成功

参考技术A 无法获取环境变量。
由于使用ansible脚本批量化部署环境,网络环境走的代理,但是有些模块总是无法执行成功,最后经过排查是因为ansible远程连接通过ssh,无法获取环境变量,我的环境变量是在/etc/profile文件里。可以通过shell命令先导入环境变量。

以上是关于Linux-两种ssh远程执行命令方式加载环境变量区别的主要内容,如果未能解决你的问题,请参考以下文章

ssh远程连接服务器执行命令

shell脚本ansible执行不成功

ssh如何远程执行命令?

SSH远程执行命令环境变量问题

SSH 从本地文件运行命令并传递本地环境变量

Linux下通过ssh来执行rsync同步远程文件