Contents

在Linux中更改Default Shell

1. 概述

交互式 shell 从tty 终端上的用户输入读取命令。我们将用户成功登录后的交互式 shell 称为默认 shell 或登录 shell。

在本教程中,我们将讨论如何更改用户的默认 shell。

2.  chsh命令介绍

chsh 命令util-linux 软件包一起提供 ——一个标准软件包,可用于所有 Linux 发行版

使用 带有*-l选项的chsh*命令,我们可以列出当前系统中安装的 shell:

$ chsh -l
/bin/sh
/bin/bash
/bin/zsh
/usr/bin/zsh
/usr/bin/git-shell

chsh命令更常见的用法是更改用户的默认 shell。

我们将在后面的部分中讨论如何做到这一点。

3. 我目前使用的是哪个 Shell?

成功登录后,我们将使用默认 shell。

在我们讨论更改默认 shell 之前,让我们首先了解几种方法来找出我们当前使用的 shell。

一种方法是**读取系统环境*$SHELL* **,其中存储了当前运行的 shell 命令:

kent$ echo $SHELL
/bin/zsh

如上例所示,我当前登录用户的运行 shell 是 Zsh。

或者,我们可以通过探索其进程信息来了解当前正在运行的 shell。Linux 将运行 shell 的 PID 存储在特殊变量$$中:

kent$ echo $$
153492

在上面的示例中,PID为 153492的进程将是当前的 shell 进程。我们可以使用带有*-p*选项的ps 命令获取有关该进程的详细信息:

kent$ ps -p $$
    PID TTY          TIME CMD
 153492 pts/2    00:00:00 zsh

输出告诉我们 Zsh 是我们当前的 shell。

4. 更改当前用户的默认shell

如果我们想更改当前登录用户的默认 shell,我们可以执行带有*-s NEW_SHELL选项的chsh*命令。

让我们将当前用户的默认 shell 更改为 Bash:

kent$ chsh -s /bin/bash
Changing shell for kent.
Password: 
Shell changed.

值得一提的是,**在我们成功更改默认shell后,当前运行的shell不会更改。**例如,我们将 Bash 设置为用户kent的默认 shell ,但当前的 shell 仍然是 Zsh:

kent$ ps -p $$ 
   PID TTY TIME CMD 
153492 pts/2 00:00:00 zsh

新更改的默认 shell 将在我们下次使用用户 kent 登录时生效。

默认的 shell 命令对于用户登录是必不可少的。如果该命令无效,我们将无法使用该用户登录。

因此,当我们更改默认 shell 时,chsh命令将验证给定的 shell 命令是否有效。

让我们看看如果我们将无效路径传递给chsh命令会发生什么:

kent$ chsh -s /bin/bashhhh
Changing shell for kent.
Password: 
chsh: "/bin/bashhhh" does not exist

我们已经了解到chsh命令可以列出系统中当前安装的 shell。

如果给定的 shell 不在系统的有效 shell 列表中,则chsh命令将拒绝更改默认 shell :

kent$ chsh -s /usr/bin/cat
Changing shell for kent.
Password: 
chsh: "/usr/bin/cat" is not listed in /etc/shells.
Use chsh -l to see list.

在上面的示例中,我们尝试将*/usr/bin/cat命令设置为用户kent* 的默认 shell。

cat命令路径有效。 但是,它不在 shell 列表中。因此,chsh中止了相应的错误消息和提示。

5. 更改其他用户的默认shell

到目前为止,我们已经学习了如何使用chsh命令来更改当前登录用户的默认 shell。

我们还可以使用chsh命令更改其他用户的默认 shell,但我们需要 root权限才能执行此操作。

语法非常简单:

root# chsh -s NEW_SHELL USERNAME

这一次,我们以root用户身份登录,并将用户kent的默认 shell 更改为 /bin/sh

root# chsh -s /bin/sh kent 
Changing shell for kent.
Shell changed.

现在,让我们以用户kent再次登录,并检查默认 shell 是否更改成功:

sh-5.1$ echo $SHELL
/bin/sh

如上面的输出所示,用户kent的默认 shell现在是*/bin/sh*。

6. 编辑*/etc/passwd*文件

我们已经学会了使用chsh命令来更改用户的默认 shell。或者,我们也可以通过编辑*/etc/passwd*文件来做到这一点。

在 Linux 中,/etc/passwd文件是纯文本文件。它存储用户登录时需要的用户帐户信息

-rw-r--r-- 1 root root 2.1K Mar 12 10:27 /etc/passwd

如果我们查看它的权限标志 ,我们会看到所有用户都可以读取它,但只有root用户可以写入/etc/passwd。

让我们检查*/etc/passwd*文件中的内容:

kent$ cat /etc/passwd
root:x:0:0:root:/root:/bin/zsh
bin:x:1:1:bin:/bin:/bin/false
...
kent:x:1000:1000::/home/kent:/bin/zsh
guest:x:1001:1001::/home/guest:/bin/zsh
...
cups:x:209:209:cups helper user:/:/sbin/nologin
...

文件中的每一行都记录了一个用户的帐户信息。记录中的字段由冒号分隔。

记录包含用户的帐户数据,例如用户名、UID、GID 和主目录等。最后一个字段表示用户的默认外壳。

如果我们更改*/etc/passwd*文件中的默认shell字段,它将在用户下次登录系统时生效。

编辑*/etc/passwd*文件的一个优点是我们可以一次性更改多个用户的默认 shell。有时,这可能非常方便。

但是,我们应该记住,当我们保存/etc/passwd*文件时,更改的默认 shell 不会发生验证或验证。

因此,我们必须确保我们提供了有效的 shell 命令路径。否则,用户下次登录系统会出现问题。