news 2026/9/30 2:02:17

Linux chsh 命令详解:更换登录 Shell 的完整实战指南(linux-command 项目)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux chsh 命令详解:更换登录 Shell 的完整实战指南(linux-command 项目)
  • 文档
  • 教程

【免费下载链接】linux-command

Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux

项目地址:https://gitcode.com/GitHub_Trending/linux/linux-command
点击查看免费下载

导读

chsh(change shell)是 Linux 系统中用于更换用户登录 Shell 的核心命令,也是 linux-command 仓库中收录的常用系统管理工具之一。本文以 command/chsh.md 文档为基础,结合仓库内用户管理相关命令文档(如 useradd、usermod、nologin),系统讲解 chsh 的语法、选项、底层原理与真实操作流程,读完即可独立完成"查看可用 Shell、切换 Shell、改回原 Shell"的完整闭环操作。

命令概述:chsh 是做什么的

chsh命令用来更换登录系统时使用的 shell。Linux 系统中每个用户都有一项默认登录 Shell 的配置,它决定了用户通过终端或 SSH 登录后所进入的交互环境(如 bash、zsh、sh 等)。chsh 允许普通用户或管理员在不重建账号的前提下,安全地变更这一设置。

若在不指定任何参数与用户名称的情况下执行 chsh,命令会以交互应答的方式进行设置——系统会提示输入新的 Shell 路径,并在完成后反馈修改结果,适合不熟悉命令行选项的用户使用。

语法

chsh(选项)(参数)

选项

-s<shell 名称>或--shell<shell 名称>:更改系统预设的shell环境。 -l或--list-shells:列出目前系统可用的shell清单; -u或--help:在线帮助; -v或-version:显示版本信息。

参数

用户名:要改变默认shell的用户。

实操一:查看系统安装了哪些 Shell(两种方法)

修改 Shell 之前,首先需要确认系统中存在哪些可用的 Shell。文档给出了两种等效方法:

第一种:使用 chsh -l 直接查看

[rocrocket@localhost ~]$ chsh -l /bin/sh /bin/bash /sbin/nologin /bin/zsh

第二种:查看 /etc/shells 文件

[rocrocket@localhost ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/zsh

其实chsh -l读取的正是/etc/shells这个文件。该文件是系统公认的合法 Shell 清单,只有列在其中的 Shell 才能被 chsh 设置为登录 Shell,这既是安全边界,也是兼容性保证。

值得留意的是,输出中出现了/sbin/nologin。在 command/nologin.md 中有更详细的说明:将某个用户的登录 Shell 设置为/sbin/nologin即可礼貌地拒绝该用户登录系统(终端输出 "This account is currently not available" 并记录日志),常用于仅需启动服务、无需交互登录的账号。这与chsh -l清单中的 nologin 项相互印证,说明"可用 Shell"并不局限于交互式解释器。

实操二:查看当前正在使用的 Shell

[rocrocket@localhost ~]$ echo $SHELL /bin/bash

注意SHELL一定要是大写。可以看到,目前使用的 shell 是/bin/bash。$SHELL是登录时由系统根据/etc/passwd中该用户的 Shell 字段注入的环境变量,因此它反映的是"登录 Shell",而不是临时执行的其他解释器。

实操三:把我的 Shell 改成 zsh

假设系统中已安装 zsh(如上述/bin/zsh),执行:

[rocrocket@localhost ~]$ chsh -s /bin/zsh Changing shell for rocrocket. Password: Shell changed. [rocrocket@localhost ~]$

使用 chsh 加选项-s就可以修改登录的 shell 了。此时你会发现执行echo $SHELL后仍然输出为/bin/bash,这是因为该变量在本次会话登录时就已经固定,需要重启(重新登录)你的 shell 才完全投入到 zsh 怀抱中去。

底层原理:chsh -s 修改的是 /etc/passwd

chsh -s其实修改的就是/etc/passwd文件里和你的用户名相对应的那一行。现在来查看下:

[rocrocket@localhost ~]$ cat /etc/passwd | grep ^rocrocket rocrocket:x:500:500:rocrocket,China:/rocrocket/PSB/home:/bin/zsh

你可以发现输出内容的最后部分已经变成了/bin/zsh了。/etc/passwd中每一行以冒号分隔的字段依次是:用户名、密码占位符、UID、GID、注释信息、家目录、登录 Shell。chsh 的核心工作就是替换最后这个字段。下次重启(或重新登录)的时候,linux 就会读取这一字段来启动 shell 了。

为什么普通用户也能修改自己的 Shell

普通用户执行 chsh 时会被要求输入自己的登录密码(如上例中的Password:提示),这是系统对身份的一次复核;而修改动作仅限定为该用户自己的 Shell 字段,因此不会破坏系统其他账号的配置。管理员则可以直接指定用户名来修改任意用户的 Shell,例如chsh -s /bin/zsh otheruser。

实操四:把 Shell 修改回 /bin/bash

改回默认的 bash 同样一行命令即可:

[rocrocket@localhost ~]$ chsh -s /bin/bash Changing shell for rocrocket. Password: Shell changed.

同样地,重新登录后生效,可通过echo $SHELL验证是否恢复为/bin/bash。

结合仓库源码:chsh 在用户管理工具链中的位置

在 linux-command 仓库中,chsh 并非孤立存在,它与一系列用户管理命令共同构成完整的账号管理链路,从仓库文档中可以清晰看到它们的协作关系:

  • 创建账号时的 Shell 预设:command/useradd.md 中的-s, --shell SHELL选项用于在创建用户时直接指定登录 Shell;未指定时则使用/etc/default/useradd中的默认值。这相当于在账号创建阶段就完成了 chsh 才能做的修改。
  • 事后修改 Shell:chsh 正是对已存在账号执行同样修改的专用命令;而 command/usermod.md 中的-s<shell>选项也可以修改用户登入后所使用的 shell,与 chsh 功能等价,适合需要在一条命令中同时修改其他账号属性(如-L锁定、-G附加组)的场景。
  • 禁止登录的 Shell 技巧:command/nologin.md 演示了把/etc/passwd中用户 Shell 改为/sbin/nologin来禁止个别用户登录的方法——这正是 chsh -s /sbin/nologin 的典型应用场景,常用于系统维护期间或服务账号。
  • 身份切换验证:command/su.md 中的su -l选项在切换身份时会同时变更HOME、SHELL、USER、logname等环境变量,因此切换后echo $SHELL会显示目标用户的登录 Shell,可作为验证 chsh 修改是否生效的间接手段。

可见,从 useradd 创建、usermod/chsh 修改,到 nologin 禁用,Shell 字段始终是贯穿整个用户管理流程的关键配置项。

使用注意事项与常见误区

  1. 必须使用 /etc/shells 中的合法路径:chsh 会校验-s指定的路径是否存在于/etc/shells中,随意填写一个未登记的路径会被拒绝;如需启用某个已安装但未登记的 Shell,可先将其加入/etc/shells(需要 root 权限)。
  2. 修改后不会立即生效:$SHELL变量在会话登录时已固化,执行 chsh 后需重新登录(或重启终端)才能看到变化,这是文档实操中特别强调的易错点。
  3. 权限区分:普通用户只能修改自己的 Shell 且需输入密码;root 用户可以配合用户名参数修改任意账号,例如批量将服务账号的 Shell 统一改为/sbin/nologin。
  4. 与临时切换区分:chsh 是永久修改登录配置;若只想在本次会话临时使用其他 Shell,直接执行该 Shell(如zsh)或使用su -s即可,不会改动/etc/passwd。

总结

chsh 是 Linux 用户管理中"小而关键"的命令:语法只有-s、-l、-u、-v四个核心选项,参数仅需一个用户名,但其背后关联着/etc/shells的合法性校验、/etc/passwd的字段语义以及登录 Shell 的生效机制。掌握chsh -l查看清单、chsh -s <路径>切换、echo $SHELL验证这一套操作组合,再结合仓库中 useradd、usermod、nologin 等命令文档,即可在实际工作中灵活完成 Shell 环境的定制与用户登录策略的管理。

  • 文档
  • 教程

【免费下载链接】linux-command

Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux

项目地址:https://gitcode.com/GitHub_Trending/linux/linux-command
点击查看免费下载
上一篇:ChatGPT-CodeReview:基于AI的智能代码审查机器人
下一篇:res-downloader 实战教程:本地代理一键抓取视频号、抖音、网页图片,5 分钟跑通下载流程

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 2:01:15

AI生成可综合RTL:GPIO IP全生命周期设计实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 2:00:14

提高代码速度的三大维度:运行、维护与交付

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 1:57:35

FreeIPA 单节点搭建实战:服务端安装与客户端纳管

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华