zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Linux 中的 Login Shell 是什么?

2023-04-18 16:59:28 时间

Login shell 是登录到交互式会话(interactive session)时使用用户 ID 执行的第一个进程。

这个解释乍一看比较简单,但仔细想想又有些模糊。为了便于理解,下面我们重新看一下 Linux 系统的登录过程。

Linux 是一个多用户的操作系统,可以允许多个用户同时登录和使用系统。

Linux 系统的第一个进程,不管是 init 还是 systemd,都会启动 getty 程序。这个 getty,是“get tty”(tty表示物理或虚拟终端)的缩写,负责保护系统免受未经授权的访问。

图片

当你尝试连接到 Linux 系统(登录本地系统,或者通过 ssh 连接远程服务器)时,getty 会(通过登录程序)提示你输入用户名,输入完用户名后,又会提示你输入密码。

登录时输入的信息(用户名和密码),系统会将其根据存储在 /etc/passwd 中的信息进行验证。/etc/passwd 文件中存储的信息包含用户名、用户 ID、主目录以及登录成功后要启动的第一个程序等。

图片

如上图所示,用户 abhishek 登录时启动的第一个程序(针对 Linux 中的标准用户),是 Login Shell。

字段中也可能有其他值。比如,sshd 是一个系统用户,而不是一个真正的用户,它不能像 abhishek 这样的普通用户那样以交互方式登录系统。如下所示:

sshd:x:110:65534::/run/sshd:/usr/sbin/nologin

如果第一个程序那一列中没有信息,那么默认为 /bin/sh,即标准 shell。

Login shell 和 non-login shell

我们登录到一个系统,知道它是一个 login shell,那么这意味着什么呢?是不是还有其他 shell 呢?

在 Linux 中,当你运行一个 shell 脚本时,它是在自己的 shell(非交互式 shell)中运行的。你可以在当前 shell(交互式 shell)中启动一个新 shell。

图片

从技术角度讲,这些都是子 shell。

shell 的配置文件和 RC 文件

login shell 从 /etc/profile 和主目录中的配置文件中读取环境变量和其他配置,这得以让我们可以使用 tab 补全键、设置彩色输出以及其他内容(比如 umask)等。

你可能知道在 Linux 系统中可用不止一个 shell,大多数 Linux 发行版都默认使用 bash shell,你也可以安装其他的 shell,比如 zsh 或者 Fish shell

如果你的 login shell 是 bash,那么其配置文件为 /etc/profile~/.bash_profile,如果是 zsh,它的配置文件为 /etc/zprofile~/.zprofile

/etc 目录中的文件通常为系统中为用户设置的各自 shell 的配置,这通常由系统管理员设置。

用户主目录中的文件是特定于用户的。这允许用户为常用命令创建别名或为程序使用自定义 PATH 变量。

non-login shell 源于 login shell,因此它通过配置文件获取登录shell设置的所有环境。除此之外,非登录交互式shell可以通过/etc/home目录中的rc(资源配置)文件定义自己的环境变量。

对于bash shell,通常是 /etc/bash.bashc 和 ~/.bashrc 文件,而对于zsh shell,则是 /etc/zshrc ~/.zshrc 文件。

看下面的例子:

图片

上图中,shell 读取 /etc/bash.bashrc 文件后,其提示符变成了绿色。Ubuntu 在该文件中添加了其他参数,颜色设置是其中之一。

概况一下:

  • 配置文件用于交互式 login shell,rc 文件用于交互式 non-login shell;
  • 首先执行/etc/directory中的文件,然后执行home目录中的文件;
  • 配置文件和 rc 文件同时作用于非交互式的 non-login shell。

如何查看当前是否在 login shell 中?

这非常简单,至少对于 bash shell 来说是这样。对于 login shell,shell 可执行文件的名称以 - 开头。对于non-login shell,它只是 shell 的名称。

图片

在桌面 Linux上,通常不使用 login shell,登录由显示管理器管理。这就是为什么当在 Linux 桌面上打开一个终端时,我们会看到即使是在终端中运行的第一个 shell 也不是login shell。