参考: https://blog.csdn.net/nklinsirui/article/details/104673286
SSH远程执行脚本报错
SSH 远程执行脚本报错"command not found"。在宿主机可以执行命令。
原因是之前将环境变量配置在了 /etc/profile 中,但是SSH远程执行脚本时实际上执行的是 non-login shell,而 non-login shell不会读取 /etc/profile 配置文件,只读取 ~/.bashrc。
login shell和non-login shell
用SSH客户端登陆Linux系统时,要求输入用户名/密码登录或根据SSH key登录时,就是login shell。
而在A机器上再用SSH免密码登录B机器,在B机器上执行Shell脚本,就是non-login shell。
用Ansible在目标机器上远程执行Shell脚本时,也是non-login shell,因为Ansible是基于SSH的。
login shell和non-login shell读取的环境变量配置文件
login-shell读取环境变量配置文件:
- /etc/profile
- ~/.bash_profile
- ~/.profile
- ~/.bashrc
- /etc/bashrc
注意:~/.bash_profile中已经引入了~/.bashrc,而~/.bashrc引入了/etc/bashrc,因此login shell可以读取到~/.bashrc和/etc/bashrc的配置。
| |
non-login shell读取环境变量配置文件:
- /etc/bashrc
- ~/.bashrc
解决non-login shell的环境配置问题
方法一:
将login-shell和non-login shell都需要的环境配置放在~/.bashrc中,其它配置放在~/.bash_profile中。
方法二:
如果环境配置只放在~/.bash_profile中,需要执行non-login shell时先source ~/.bash_profile再执行命令。
方法三:
在 ~/.bashrc 里添加: . /etc/profile。(立即生效需要: source ~/.bashrc)