Skip to content

su – 切换用户身份

命令用于切换其他使用者的身份,除 root 外,需要键入该使用者的密码。

语法格式

bash
su [参数] [用户名]

选项

选项说明
--l--login模拟登录,加载目标用户的环境变量
-c--command以目标用户身份执行单条命令
-m-p保持当前环境变量不变
-s--shell指定要使用的 shell
-h--help显示帮助信息

经典案例

bash
## 切换root
su -
# 或
su - root

su - username	# 切换到其他用户
su -c "command" username	# 执行单条命令后返回
su -m username				# 保持当前环境变量
su -s /bin/bash username	 # 指定使用的shell

sudo – 授权普通用户执行管理员命令

sudo(Super User DO)是Linux系统中允许授权用户以其他用户(通常是root)身份执行命令的安全机制。

语法格式

bash
sudo [选项] 命令

选项

选项说明
-u以指定用户身份执行(默认root)
-l列出当前用户的sudo权限
-v刷新sudo认证时间戳
-k清除/重置时间戳(要求下次输入密码)
-s启动root的shell环境
-i模拟root登录(加载环境变量)
-b在后台运行命令
-E保留当前用户环境变量

经典案例

bash
sudo apt update          # 以root身份运行apt update
sudo -l                 # 查看当前用户的sudo权限
visudo                  # 安全编辑sudoers文件
sudo -i                 # 切换到root登录环境(加载.profile)
sudo -s                 # 启动root的shell但不改变环境
sudo -E command         # 保留当前用户环境执行命令

useradd - 创建新用户账户

useradd 是 Linux 系统中用于创建新用户账户的核心工具,会同时更新以下文件:

  • /etc/passwd
  • /etc/shadow
  • /etc/group
  • /etc/gshadow
  • 用户家目录(可选)

语法格式

bash
useradd [选项] 用户名

选项

选项作用描述
-c "备注"设置用户备注信息(通常为全名)
-d 目录指定家目录路径(默认 /home/用户名
-e 日期设置账户过期日期(格式:YYYY-MM-DD)
-f 天数密码过期后宽限天数(0=立即禁用,-1=禁用此功能)
-g 主组指定主用户组(GID或组名),用户组必须存在,不会自动创建组信息
-G 附加组指定附加用户组(逗号分隔)
-m自动创建家目录(配合 -k 可指定模板目录)
-M不创建家目录(适用于服务账户)
-N不创建与用户同名的用户组
-p 密码设置加密后的密码(建议用 passwd 命令替代)
-r创建系统账户(UID范围 1-999)
-s shell指定登录shell(如 /bin/bash/sbin/nologin 禁止登录)
-u UID手动指定用户ID

典型案例

bash
# 常见普通用户
useradd -m -c "John Doe" -s /bin/bash johndoe		# 创建用户 johndoe,自动生成家目录 /home/johndoe,设置可登录的bash shell

# 创建服务用户
useradd -r -s /sbin/nologin -d /var/lib/mysql mysql		# 创建系统账户 mysql,禁止交互式登录,指定工作目录为 /var/lib/mysql

# 带附加组的用户
useradd -G wheel,developers -c "Dev User" devuser		# 主组为默认创建的 devuser 组,同时加入 wheel 和 developers 组

# 创建程序用户不创建家目录不允许登录
useradd -Ms /sbin/nologin -c "这是应用www用户" www

配置文件

/etc/default/useradd 定义默认参数:

ini
GROUP=100        # 默认起始GID
HOME=/home       # 家目录位置
INACTIVE=-1      # 密码过期宽限期。-1表示永久有效,0表示失效
EXPIRE=          # 默认过期日期
SHELL=/bin/bash  # 默认shell
SKEL=/etc/skel   # 家目录模板

注意事项

  1. 创建用户后必须用 passwd 设置密码
  2. 使用 -p 选项时需提供 已加密 的密码(可通过 openssl passwd 生成)
  3. 生产环境中建议使用 -e 设置服务账户过期时间
  4. 删除用户时如需移除家目录,应使用 userdel -r

passwd – 修改用户的密码值

passwd命令来自英文单词password的缩写,其功能是修改用户的密码值;同时也可以对用户进行锁定等操作,但需要管理员身份才可以执行。

语法格式

bash
passwd [选项] [用户名]

选项

选项说明
-l锁定用户密码(禁用账户)
-u解锁用户密码
-d删除用户密码(使账户无密码)
-e强制用户下次登录时修改密码
-S显示账户密码状态
-n设置密码最短使用天数
-x设置密码最长使用天数
-w设置密码过期前警告天数
-i设置密码过期后宽限天数
-k只更新过期的密码

经典案例

  1. 基本操作

    bash
    passwd				# 普通用户修改自己的密码
    passwd username		# root用户修改其他用户密码
    passwd -l username	# 锁定用户账户
    passwd -u username	# 解锁用户账户
    passwd -d username	# 删除用户密码(危险操作)
    passwd -e username	# 强制用户下次登录修改密码
    passwd -S username	# 查看密码状态信息
  2. 设置密码策略

    bash
    passwd -n 7 -x 90 -w 7 -i 14 username
    • 密码最短使用7天
    • 密码最长使用90天
    • 过期前7天警告
    • 过期后14天宽限期

usermod - 修改用户账户属性

usermod 是 Linux 系统中用于修改用户账户属性的重要命令,属于 shadow-utils 软件包的一部分。系统管理员常用它来调整用户的家目录、登录名、用户组等关键信息。

语法格式

bash
usermod [选项] 用户名

选项

选项功能描述示例
-a添加与-G组合使用
-c 说明修改用户备注信息(通常是全名)usermod -c "John Doe" john
-d 路径更改用户家目录usermod -d /new/home/john john
-e nday/年-月-日设置账户过期日期(YYYY-MM-DD)usermod -e 2024-12-31 john
-g gid修改用户主组usermod -g developers john
-G 附件组1,附加组2...与-a修改附加组(覆盖原有组)usermod -G sudo,webadmin john
-aG 附加组追加附加组(不覆盖)usermod -aG docker john
-l 用户名修改用户登录名usermod -l "tom" john
-L锁定用户账户usermod -L john
-m与-d配合移动家目录内容usermod -md /new/home/john john
-s SHELL修改默认登录shell。/bin/bash,/sbin/nologinusermod -s /bin/bash john
-u UID修改用户UIDusermod -u 2000 john
-U解锁用户账户usermod -U john

经典案例

bash
usermod -g developers alice							# 修改用户主组
usermod -aG sudo,docker bob							# 添加用户到附加组(保留原有组)
usermod -l newname -d /home/newname -m oldname		# 更改用户名并移动家目录
usermod -e 2024-12-31 tempuser						# 设置账户过期时间
usermod -L locked_user								# 锁定
usermod -U locked_user								# 解锁账户

注意事项

  1. 修改用户名时,需要手动更新相关文件权限
  2. 修改UID后,需要手动更改文件所有权
  3. 用户必须注销后才能完全应用某些修改
  4. 使用-m选项时确保新目录不存在
  5. 重要系统用户的UID不要随意修改(如root用户)

userdel - 删除账号

userdel 是 Linux 系统中用于删除用户账户的命令,属于 shadow-utils 软件包的一部分。该命令通常由系统管理员使用,用于清理不再需要的用户账户。

语法格式

bash
userdel [选项] 用户名

选项

选项功能描述
-f, --force强制删除用户(即使该用户仍在登录状态)
-r, --remove删除用户的同时删除其家目录和邮件池
-Z, --selinux-user同时删除 SELinux 用户映射

经典案例

bash
# 仅删除 /etc/passwd 和 /etc/shadow 中的用户记录,但保留 /home/username 目录
userdel username					# 基本删除用户(保留家目录)
userdel -r username					# 删除用户并移除家目录
userdel -f username					# 强制删除用户(即使该用户正在运行进程)
userdel -Z username					# 删除用户并清理 SELinux 映射

注意事项

  1. 权限要求:必须使用 sudoroot 权限执行。
  2. 文件残留:默认情况下,userdel 不会删除用户的家目录和邮件池,除非使用 -r 选项。
  3. 进程影响:如果用户仍有运行中的进程,删除可能导致问题(可使用 -f 强制删除)。
  4. UID/GID 冲突:删除用户后,其 UID 和 GID 可能被新用户复用,需检查文件权限。
  5. 系统用户:谨慎删除系统用户(如 mysqlnginx),可能导致服务异常。

groupadd - 创建用户组

groupadd 是 Linux 系统中用于创建新用户组的命令,属于 shadow-utils 软件包的一部分。系统管理员常用它来管理用户权限,控制文件访问。

语法格式

bash
groupadd [选项] 组名

选项

选项功能描述
-g, --gid GID指定新组的 GID(组ID)
-f, --force如果组已存在,强制成功退出(不报错)
-o, --non-unique允许使用重复的 GID(不推荐)
-p, --password PASSWORD设置组密码(极少使用)
-r, --system创建系统组(GID 范围通常为 1-999)
-K, --key KEY=VALUE覆盖 /etc/login.defs 中的默认值

经典案例

bash
groupadd developers				# 创建普通用户组
groupadd -g 1500 admins			# 创建指定 GID 的组
groupadd -r docker				# 创建系统组(用于服务/守护进程)
groupadd -f testgroup			# 强制创建组(即使组名已存在)

验证

bash
getent group 组名  # 查看组信息
cat /etc/group    # 检查所有组

gpasswd - 组管理

gpasswd 是 Linux 系统中用于管理 /etc/group/etc/gshadow 文件的命令,主要用于:

  • 设置/修改组密码(允许非组成员临时加入组)
  • 管理组管理员(可添加/删除组成员)
  • 控制组成员列表

NOTE

适用场景:团队协作、共享目录权限管理、临时提权(如 sudo 组管理)。

语法格式

bash
gpasswd [选项] 组名
gpasswd [选项] -a 用户名 组名  # 添加用户到组
gpasswd [选项] -d 用户名 组名  # 从组移除用户

选项

选项功能描述
-a, --add 用户名添加用户到组(需 root 或组管理员权限)
-d, --delete 用户名从组移除用户
-r, --remove-password删除组密码(禁用 newgrp 切换)
-R, --restrict禁用 newgrp 切换(非组成员无法加入)
-A, --administrators 用户列表设置组管理员(逗号分隔)
-M, --members 用户列表直接设置组成员(覆盖原有成员)

经典案例

bash
gpasswd -a alice developers  			# 添加 alice 到 developers 组
groups alice  							# 查看 alice 所属组
getent group developers  				# 查看组 members
gpasswd -d bob developers  				# 移除 bob
gpasswd developers  					# 交互式设置密码
gpasswd -r developers  					# 移除密码
gpasswd -A alice developers  			# 让 alice 管理 developers 组
gpasswd -M alice,bob,charlie team  		# 重置组为仅这三人

groupdel - 删除组

groupdel 是 Linux 系统中用于删除用户组的命令,属于 shadow-utils 软件包的一部分。系统管理员常用它清理不再需要的用户组。

语法格式

bash
groupdel [选项] 组名

选项

选项功能描述
-f, --force强制删除组(即使组是某用户的主组)
-h, --help显示帮助信息
-R, --root CHROOT_DIR在指定的 chroot 目录下操作

经典案例

bash
groupdel developers						# 删除普通用户组
groupdel -f oldgroup					# 强制删除组(即使有用户的主组是该组)
groupdel -R /mnt/chroot_env testgroup	# 在 chroot 环境下删除组

groupmod - 修改用户组属性

groupmod 是 Linux 系统中用于修改现有用户组属性的命令,属于 shadow-utils 软件包的一部分。它允许管理员更改组名(GID)组ID(GID),而无需删除并重建组。

语法格式

bash
groupmod [选项] 组名

选项

选项功能描述
-g, --gid GID修改组的 GID(组ID)
-n, --new-name NEW_GROUP修改组名
-o, --non-unique允许使用重复的 GID(不推荐)
-p, --password PASSWORD设置组密码(极少使用)
-R, --root CHROOT_DIR在 chroot 环境下操作

经典案例

bash
groupmod -n new_developers old_developers		# 修改组名(不改变 GID)
groupmod -g 2000 developers						# 修改组的 GID(不改变组名)

id - 查看用户和组信息

id 是 Linux 系统中用于查看用户和组信息的命令,可以显示:

  • 用户 UID(User ID)
  • 主组 GID(Group ID)
  • 附加组(Supplementary Groups)
  • 用户上下文(SELinux 环境)

语法格式

bash
id [选项] [用户名]  # 不指定用户名时,默认显示当前用户信息

选项

选项功能描述
-u, --user仅显示 UID
-g, --group仅显示主组 GID
-G, --groups显示所有附加组 GID
-n, --name显示名称而非数字 ID(需配合 -u/-g/-G
-r, --real显示真实 ID(而非有效 ID,在 sudo 时有用)
-Z, --context显示 SELinux 安全上下文

经典案例

bash
id					# 查看当前用户的基本信息
# uid=1000(alice):用户 ID 和用户名
# gid=1000(alice):主组 ID 和组名
# groups=...:附加组列表

id -u alice  		# 仅显示 UID(适用于脚本)
id -gn alice 	 	# 仅显示主组名称
id -Gn alice		# 显示所有附加组名称
id -Z				# 查看 SELinux 上下文(如启用)

groups - 显示用户所属组

groups 是 Linux 和 Unix 系统中用于显示用户所属组的命令。它比 id -Gn 更简洁,直接列出用户的所有附加组名称(不显示 UID/GID)。

语法格式

bash
groups [用户名]  # 不指定用户名时,默认显示当前用户的组

经典案例

bash
groups				# 查看当前用户的组
# 第一个组(alice)是​​主组(Primary Group)​​,其余是​​附加组​​


groups bob			# 查看指定用户的组​

注意事项

  1. id -Gn 的区别:
    • groups 仅显示组名,不提供 UID/GID 信息。
    • id -Gn 在脚本中更常用(标准化输出)。
  2. 主组显示:
    • groups 输出的第一个组是主组(与 id -gn 一致)。
  3. 系统兼容性:
    • macOS 的 groups 命令格式略有不同(不支持 -a 等选项)。

w - 查看当前登录用户及其活动

w 是 Linux/Unix 系统中用于实时查看当前登录用户及其活动的命令。它综合了 whouptimeps 的部分功能,显示:

  • 已登录用户
  • 用户正在运行的命令
  • 系统负载(uptime)
bash
w [选项] [用户名]  # 不指定用户名时,显示所有用户信息

选项

选项功能描述
-h, --no-header隐藏表头信息
-u, --no-current忽略当前用户进程(简化输出)
-s, --short简洁模式(不显示 JCPU/PCPU 时间)
-f, --from显示用户登录来源(IP/主机名)
-i, --ip-addr强制显示 IP 地址(而非主机名)

输出字段解析

字段说明
USER登录用户名
TTY终端类型(pts/0=远程,tty1=本地)
FROM登录来源 IP/主机名(- 表示本地)
LOGIN@登录时间
IDLE空闲时间(格式为 分钟:秒
JCPU该终端所有进程占用 CPU 时间
PCPU当前进程占用 CPU 时间
WHAT用户正在执行的命令

经典案例

bash
w							#  查看所有登录用户(完整信息)
w -h						# 隐藏表头(适用于脚本处理)
w alice						# 仅显示指定用户信息
w -s						# 简洁模式(隐藏 CPU 时间)
w -i						# 显示登录来源 IP(替代 who)​
w | grep -v "192.168.1.*"	# 监控异常登录(结合 grep)

注意事项

  1. 权限要求:普通用户可查看信息,但部分系统可能限制 FROM 字段。

  2. WHAT 字段限制:

    • 某些命令(如 sudo 启动的进程)可能显示为 -bashsshd
  3. who/last 的区别:

    命令功能
    w实时用户+活动+负载
    who仅登录用户(无活动信息)
    last历史登录记录

whoami - 显示当前登录用户的用户名

whoami 是 Linux/Unix 系统中用于快速显示当前登录用户的用户名的命令。它是 who am i 的简化版本,仅返回有效用户身份(Effective User)。

语法格式

bash
whoami [选项]

选项

选项功能描述
--help显示帮助信息
--version显示版本信息

经典案例

bash
whoami			# 显示当前用户名

chmod - 修改文件或目录权限

chmod(Change Mode)是 Linux/Unix 系统中用于修改文件或目录权限的核心命令,通过调整**用户(User)、组(Group)、其他(Other)**的读(r)、写(w)、执行(x)权限,实现文件访问控制。

语法格式

bash
chmod [选项] 权限模式 文件/目录
chmod [选项] 八进制权限 文件/目录

权限模式解析

1. 符号表示法(u/g/o/a +/-/= r/w/x)

符号含义
u文件所有者(User)
g所属组(Group)
o其他用户(Other)
a所有用户(All)
+添加权限
-移除权限
=直接设置权限

2. 八进制表示法(0-7)

数字权限二进制
0---000
1--x001
2-w-010
3-wx011
4r--100
5r-x101
6rw-110
7rwx111

选项

选项功能
-R, --recursive递归修改目录及其内容
-v, --verbose显示详细操作信息
-c, --changes仅显示被修改的文件
--reference=FILE参照指定文件的权限

经典案例

bash
chmod u+x script.sh    	# 给所有者添加执行权限  
chmod go-w file.txt    	# 移除组和其他用户的写权限  
chmod a=rw config.cfg  	# 所有用户仅保留读写权限  
chmod 755 script.sh    	# u=rwx, g=rx, o=rx  
chmod 640 secret.txt   	# u=rw, g=r, o=无权限
chmod +x install.sh  	# 所有用户可执行(等价于 a+x)
chmod -R 750 /var/www  	# 递归修改目录权限.所有者=rwx, 组=rx, 其他=无权限

注意事项

  1. 权限继承:
    • 目录的 x 权限代表可进入,文件代表可执行
    • 默认新建文件权限受 umask 影响(如 umask 022 则文件权限为 644)。
  2. 危险操作:
    • chmod -R 777 / 会完全开放系统权限(⚠️ 严禁使用)。
    • 系统关键文件(如 /etc/shadow)通常权限为 600,勿随意修改。
  3. 权限冲突:
    • 即使有文件 rwx 权限,若其父目录无 x 权限,仍无法访问

chown - 修改文件归属

命令用于设置文件所有者和文件关联组的命令。

语法格式

bash
chown [选项] 所有者[:组] 文件/目录

核心功能

操作类型命令示例说明
修改所有者chown alice file.txt将文件所有者改为 alice
修改所有者+组chown alice:dev file.txt同时修改所有者和组
仅修改组chown :dev file.txt等价于 chgrp dev file.txt
递归修改chown -R alice:dev /dir递归修改目录内所有内容

选项

选项作用
-R递归操作(对目录及其内容生效)
-v显示详细操作信息
-c仅显示被修改的文件
--reference=FILE参照指定文件的所有权设置

经典案例

bash
chown -R www-data:www-data /var/www/html		# 修改文件所有权
chown alice: file.txt  							# 冒号后不指定组,保持原组不变
chown 1001:1002 file.txt  						# 直接使用UID/GID数字
chown --reference=model.txt newfile.txt			# 参照其他文件权限

注意事项

  1. 权限需求

    • 普通用户只能修改自己拥有的文件
    • 系统级修改需要 sudo 或 root 权限
  2. 符号链接处理

    bash
    chown -h alice symlink  # 修改符号链接本身的所有权
  3. 安全风险

    • 避免随意修改系统关键文件(如 /etc, /bin 等)的所有权
    • 递归修改前建议备份:tar -czvf backup.tar.gz /target/dir
  4. chmod 的区别

    命令作用维度典型场景
    chown所有权归属文件归属权转移
    chmod权限控制读写执行权限管理

umask - 权限掩码

umask(user file-creation mask)是Linux系统中用于控制新建文件/目录默认权限的掩码值。它通过屏蔽(取消)特定权限位来设置安全基线。

语法格式

bash
umask [-p] [-S] [mode]
  • 无参数:显示当前umask值
  • -S:符号模式显示(rwx形式)
  • -p:可重用输出格式
  • mode:设置新umask值(八进制或符号格式)

权限计算原理

  • 文件默认权限:666 - umask

  • 目录默认权限:777 - umask

  • 实际权限 = 默认权限 & (~umask)

    选项说明
    0022典型安全设置(文件644,目录755)
    0002组可写(文件664,目录775)
    0077严格模式(文件600,目录700)

注意事项

  1. umask是进程属性,只在当前shell会话有效

  2. 系统服务可能有自己的umask设置(如/etc/init.d/脚本)

  3. 新建文件的执行权限需单独赋予(chmod +x)

  4. 特殊场景:

    bash
    # 共享目录设置
    umask 0002
    chmod g+s /shared_dir

权限对照表

umask文件权限目录权限
022644755
027640750
077600700

NOTE

使用umask -p输出的命令可直接在脚本中重用

案例

bash
# 查看当前umask(八进制)
umask
# 输出示例:0022

# 查看符号表示
umask -S
# 输出:u=rwx,g=rx,o=rx

# 临时修改umask
umask 027  # 文件默认640,目录默认750

# 永久生效(添加到~/.bashrc或/etc/profile)
echo "umask 022" >> ~/.bashrc

chsh - 更改用户登录 shell

chsh 命令用于更改用户的登录 shell。系统管理员可以使用此命令为任何用户更改 shell,普通用户只能更改自己的 shell。该命令会修改 /etc/passwd 文件中的 shell 字段。

语法格式

bash
chsh [-s shell] [-l] [username]

选项

选项描述示例
-s shell指定新的登录 shell 路径chsh -s /bin/zsh
-l列出系统可用的有效 shellchsh -l
username指定要更改 shell 的用户名chsh -s /bin/bash bob

经典案例

bash
# 查看当前用户可用的 shell 列表
chsh -l

# 将当前用户的 shell 改为 zsh
chsh -s /bin/zsh

# 管理员将用户 alice 的 shell 改为 fish
sudo chsh -s /usr/bin/fish alice

# 查看当前用户的 shell 设置
grep `whoami` /etc/passwd | cut -d: -f7

注意事项

  1. 新指定的 shell 必须存在于 /etc/shells 文件中,否则会报错
  2. 普通用户只能更改自己的 shell,不能更改其他用户的 shell
  3. 某些系统可能要求用户重新登录才能使更改生效
  4. 如果用户当前正在运行某些程序,更改 shell 可能不会立即影响这些程序
  5. 使用 -s 选项时,必须提供 shell 的完整路径,不能只写 shell 名称

chage - 更改用户密码过期信息

chage 命令用于查看和修改用户密码过期策略,是Linux系统管理用户账户的重要工具。它可以设置密码的最长有效期、最短修改间隔、过期警告天数等安全策略。

语法格式

bash
chage [选项] 用户名

选项

选项描述示例
-d 天数设置密码最后修改日期(1970-1-1以来的天数)chage -d 0 user1
-E 日期设置账户过期日期(YYYY-MM-DD)chage -E 2024-12-31 user1
-I 天数密码过期后账户被锁定的宽限天数chage -I 7 user1
-l列出账户过期信息chage -l user1
-m 天数设置密码最短使用天数chage -m 7 user1
-M 天数设置密码最长使用天数chage -M 90 user1
-W 天数设置密码过期前警告天数chage -W 7 user1

经典案例

bash
# 查看用户密码过期信息
sudo chage -l user1

# 强制用户下次登录时修改密码
sudo chage -d 0 user1

# 设置密码策略:90天有效期,提前7天警告
sudo chage -M 90 -W 7 user1

# 设置账户2024年底过期
sudo chage -E 2024-12-31 user1

# 设置密码最短7天才能修改,最长90天必须修改
sudo chage -m 7 -M 90 user1

注意事项

  1. 需要root权限才能修改其他用户的密码策略
  2. 修改后信息存储在/etc/shadow文件中
  3. 设置为0表示无限制(某些选项除外)
  4. 使用-d 0会强制用户下次登录时修改密码
  5. 合理设置密码策略可提高系统安全性