SSH 登录后,.bashrc 文件没有被加载问题探究与解决

问题描述

SSH 登录Linux 后,ll 命令不能用,而不使用 SSH 登录的时候却没有问题,问题的根本原因时 ~/.bashrc 文件没有被加载。

快速解决

1. 单次解决

1
source ~/.bashrc

这样的解决方法需要每次SSH登录后都要执行一遍

2. 永久解决

~/.profile 文件(不存在则创建一个)中添加如下代码

1
2
3
4
5
6
7

if [ "$BASH" ]; then
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
fi

技术探究

SHELL配置文件规则

在Linux系统中,当用户登录后,Shell会按照一定的规则和顺序加载各个目录的 profile 文件。这些 profile 文件通常包含了用户的环境变量、别名、函数等配置信息,用于定制用户的Shell会话环境。

以下是登录Linux后,Shell加载各个目录的 profile 的加载规则和顺序:

  1. 全局配置文件

    • /etc/profile:这是所有用户的全局配置文件,当登录Shell时,系统会首先读取并执行这个文件。它通常包含一些系统级别的环境变量和函数定义。
    • /etc/profile.d/*.sh:这是一个目录,其中包含了以.sh结尾的脚本文件。系统会依次读取并执行这个目录下的所有脚本文件。这些脚本文件通常用于设置一些特定的环境变量或执行一些系统级的初始化操作。
      用户个人配置文件:
    • ~/.bash_profile:这是用户个人的配置文件,当用户登录时,如果该文件存在,Shell会读取并执行它。这个文件通常用于设置用户级别的环境变量和别名。
    • ~/.bash_login :如果 ~/.bash_profile 不存在,Shell会尝试加载这个文件。这也是用户个人的配置文件,与 ~/.bash_profile 的功能类似。
    • ~/.profile :如果前两个文件都不存在,Shell会加载 ~/.profile 文件。这个文件同样是用户个人的配置文件,用于定义用户的环境和初始化设置。
  2. 交互式Shell配置文件

    • ~/.bashrc:这个文件是在用户每次打开一个新的交互式Shell时加载的。它通常包含了用户的别名、函数定义以及一些交互式Shell的特定设置。
    • /etc/bashrc:这是全局的交互式Shell配置文件,当用户打开一个新的交互式Shell时,也会加载这个文件。这个文件通常包含一些全局的别名和函数定义。
  3. 加载顺序

    • /etc/profile
    • /etc/profile.d/*.sh
    • ~/.bash_profile(如果存在)
    • ~/.bash_login (如果 ~/.bash_profile 不存在)
    • ~/.profile(如果前两个文件都不存在)

交互式Shell时:~/.bashrc/etc/bashrc(通常是在新的交互式Shell启动时加载)

实践探究

1. ssh 默认参数登录

通过在 home 目录中手动添加多个文件 .bash_profile .bash_login . profile .bashrc
发现 在 SSH 默认参数登录的情况下 .bash_profile .bash_login .profile 三个文件按照顺序先后优先级只会加载一个文件,而 .bashrc 不会被加载。

所以这种情况解决办法就是在 .profile 中添加对 .bashrc 的手动加载

2. SSH 指定SHELL登录

其实在SSH登录时可以指定使用的 shell,如 sh 或者 bash。比如指定 bash 代码如下:

1
2
3

ssh user@server -t bash

这种情况登录后,.bash_profile .bash_login .profile 等三个文件都不会被加载,只会加载 .bashrc

探究总结

SSH 的不同登录方式会对 SHELL 配置文件加载有所影响,概况就是 要么是 .bashrc 要么就是 .bash_profile .bash_login .profile 三个中的一个。

所以为了适配不同的登录方式,脚本代码应该写在 .bashrc 中,然后再在 .profile 中添加对 .bashrc 的手动加载。

这样就能保住不同的登录方式都有相同的结果。