Linux 登录时bash配置加载

1、起因

通过ssh远程执行alias命令时,返回的结果和我预期的不一样,在CentOS系列上是正常的,但是在SUSE系统上就是空的。但是登录到SUSE系统上执行,返回结果却不为空。

直觉告诉我这肯定是哪里的配置文件没有加载,肯定和/etc/profile、~/.bashrc之类的文件有关。

2、bash的四种模式

上面说到的那几个配置文件都涉及到bash的登录,login还是非login,交互式还是非交互式有关。

其中,login shell就是指我们登录时获取的第一个shell,不管是本地还是远程ssh登录的shell,都是login shell,也可以理解为需要输入用户名密码的shell。而非login shell也好理解,比如你登录系统后执行某个脚本,此时脚本会另外开启一个shell执行,这个后面开启的shell就是非login shell。

而交互式和非交互式就很好理解了,远程登录肯定是交互式,远程执行命令肯定就是非交互式,这也就是造成上述问题的原因了。

下面我们就来说一下这四种方式下,bash的配置文件加载情况。

A、CentOS 7系列

1、login shell + 交互式 bash
先加载/etc/profile,然后依次寻找~/.bash_profile,~/.bash_login,~/.profile这三个文件,只要成功加载其中一个配置,就不会继续往下执行,直接退出返回。

2、login shell + 非交互式 bash
只加载~/.bashrc

3、非login shell + 交互式bash
根据BASH_ENV环境变量去加载配置文件

4、非login shell + 非交互式bash
只加载~/.bashrc

B、SUSE系列

而对于SUSE系列,情况又有所不同。

1、login shell + 交互式 bash
该情况和CentOS 7系列表现一致,先加载/etc/profile,然后依次寻找~/.bash_profile,~/.bash_login,~/.profile这三个文件,只要成功加载其中一个配置,就不会继续往下执行,直接退出返回。

2、login shell + 非交互式 bash
依次加载/etc/bash.bashrc~/.bashrc

3、非login shell + 交互式bash
和CentOS 7系列表现一致,根据BASH_ENV环境变量去加载配置文件

4、非login shell + 非交互式bash
依次加载/etc/bash.bashrc~/.bashrc

C、使用sh启动bash

还有一种比较特殊的情况,就是使用sh启动bash,配置文件又有些不同了。

1、login shell + 交互式 bash
加载/etc/profile~/.profile

2、login shell + 非交互式 bash
同上,加载/etc/profile~/.profile

3、非login shell + 交互式bash
根据ENV环境变量去加载配置文件

4、非login shell + 非交互式bash
不加载任何配置文件

3、根因

现在再来看开始提到的问题,在SUSE系统上,对于远程执行命令而言,是非login shell + 非交互式bash,会依次加载/etc/bash.bashrc 和 ~/.bashrc,但是由于alias的设置是只针对交互式bash才会生效,因此通过远程执行命令的方式,alias返回为空。

猜你喜欢

转载自blog.csdn.net/u010039418/article/details/80771580