I'm Aron

Linux用户、用户组、权限与 sudo 管理

1557 字
8 分钟
Linux用户、用户组、权限与 sudo 管理

用户和用户组的关系#

Linux 中每个用户都有一个 UID,每个用户组都有一个 GID。

用户可以属于:

  • 一个主组,也叫基本组。
  • 多个附加组。

查看用户身份信息:

Terminal window
id 用户名

查看当前用户:

Terminal window
whoami

查看系统用户信息:

Terminal window
getent passwd

查看系统用户组信息:

Terminal window
getent group

创建用户:useradd#

创建用户:

Terminal window
useradd 用户名

常用选项:

选项作用
-c指定描述信息
-u指定 UID
-d指定用户家目录
-m创建家目录
-g指定主组
-G指定附加组
-M不创建家目录
-s指定登录 Shell

示例:

Terminal window
useradd -m -d /home/testuser -s /bin/bash testuser

创建用户后设置密码:

Terminal window
passwd testuser

管理密码状态:passwd 和 chage#

修改用户密码:

Terminal window
passwd 用户名

查看密码过期信息:

Terminal window
chage -l 用户名

强制用户下次登录修改密码:

Terminal window
chage -d 0 用户名

锁定用户密码:

Terminal window
passwd -l 用户名

解锁用户密码:

Terminal window
passwd -u 用户名

删除用户:userdel#

删除用户:

Terminal window
userdel 用户名

删除用户并删除家目录:

Terminal window
userdel -r 用户名

删除用户是高风险操作,尤其是带 -r 时会删除家目录。执行前建议确认该用户是否仍有业务文件或运行中的进程。

修改用户:usermod#

usermod 用来修改已有用户。

常用选项:

选项作用
-c修改描述信息
-u修改 UID
-d修改家目录
-m移动家目录内容到新位置
-g修改主组
-G修改附加组
-aG追加附加组,常用
-s修改登录 Shell
-e设置账号过期时间
-l修改账号名称
-L锁定用户
-U解锁用户

把用户加入附加组:

Terminal window
usermod -aG docker testuser

这里推荐使用 -aG,表示追加附加组。如果只用 -G,可能会覆盖用户原有附加组。

用户组管理#

创建用户组:

Terminal window
groupadd 组名

指定 GID:

Terminal window
groupadd -g 1001 dev

删除用户组:

Terminal window
groupdel 组名

把用户加入组:

Terminal window
gpasswd -a 用户名 组名

从组中移除用户:

Terminal window
gpasswd -d 用户名 组名

查看某个组:

Terminal window
getent group 组名

文件权限怎么看#

使用 ls -l 查看文件权限:

Terminal window
ls -l file.txt

示例:

-rw-r--r-- 1 aron dev 1024 Jul 9 10:00 file.txt

第一段 -rw-r--r-- 表示权限:

- rw- r-- r--
类型 所有者 所属组 其他人

文件类型常见含义:

标记含义
-普通文件
d目录
l软链接

权限含义:

权限对文件对目录
r读取文件内容列出目录内容
w修改文件内容在目录中创建、删除、改名
x执行文件进入目录

目录的 x 权限很重要。没有 x,即使有 r,也可能无法进入目录。

chmod:修改权限#

符号方式:

Terminal window
chmod u+x script.sh
chmod g-w file.txt
chmod o+r file.txt
chmod a+r file.txt

含义:

符号含义
u所有者
g所属组
o其他人
a所有人
+增加权限
-删除权限
=设置为指定权限

数字方式:

权限数值
r4
w2
x1

常见权限:

Terminal window
chmod 755 script.sh
chmod 644 file.txt
chmod 700 private-dir

解释:

权限含义
755所有者可读写执行,组和其他人可读执行
644所有者可读写,组和其他人只读
700只有所有者可读写执行

递归修改目录及其内容:

Terminal window
chmod -R 755 目录

递归操作要谨慎,不建议随意对系统目录执行 chmod -R

chown:修改所有者和所属组#

修改文件所有者:

Terminal window
chown 用户 文件

修改所有者和所属组:

Terminal window
chown 用户:用户组 文件

递归修改目录:

Terminal window
chown -R 用户:用户组 目录

示例:

Terminal window
chown -R nginx:nginx /var/www/html

特殊权限:SGID 和粘滞位#

SGID 常用于共享目录。对目录设置 SGID 后,用户在该目录中新建的文件会继承目录的所属组。

Terminal window
chmod g+s 目录

适合多人协作目录,例如:

Terminal window
chmod g+s /data/project

粘滞位常用于公共可写目录。即使用户对目录有写权限,也不能删除其他用户的文件。

Terminal window
chmod o+t 目录

取消粘滞位:

Terminal window
chmod o-t 目录

典型例子是 /tmp 目录。

ACL:更细粒度的权限控制#

传统权限只能控制所有者、所属组、其他人。ACL 可以针对指定用户或指定组设置额外权限。

给用户设置 ACL:

Terminal window
setfacl -m u:用户名:权限 文件或目录

给用户组设置 ACL:

Terminal window
setfacl -m g:组名:权限 文件或目录

删除某个 ACL:

Terminal window
setfacl -x u:用户名 文件或目录
setfacl -x g:组名 文件或目录

删除全部 ACL:

Terminal window
setfacl -b 文件或目录

查看 ACL:

Terminal window
getfacl 文件或目录

示例:

Terminal window
setfacl -m u:alice:rw file.txt
getfacl file.txt

su 和 sudo#

su 用于切换用户:

Terminal window
su - 用户名

切换到 root:

Terminal window
su -

- 表示同时切换用户环境,更接近完整登录该用户。

sudo 用于以管理员权限执行单条命令:

Terminal window
sudo systemctl restart nginx

配置 sudo 权限建议使用:

Terminal window
visudo

示例:

testuser ALL=(ALL) NOPASSWD: ALL

这表示 testuser 可以免密执行所有 sudo 命令。生产环境中不建议随意给 NOPASSWD: ALL,应按最小权限原则授权。

权限排查思路#

遇到权限不足时,可以按这个顺序排查:

  1. 当前用户是谁:whoami
  2. 当前用户属于哪些组:id
  3. 文件或目录权限是什么:ls -l
  4. 上级目录是否有执行权限:逐级检查目录权限
  5. 是否存在 ACL:getfacl
  6. 是否需要 sudo 或切换用户

例如:

Terminal window
whoami
id
ls -ld /data
ls -ld /data/project
ls -l /data/project/app.log
getfacl /data/project/app.log

很多权限问题并不是文件本身没权限,而是上级目录缺少 x 权限。

本篇命令速查#

命令作用
id 用户名查看用户 UID、GID 和所属组
whoami查看当前用户
getent passwd查看系统用户
getent group查看系统用户组
useradd 用户创建用户
passwd 用户设置用户密码
userdel -r 用户删除用户及家目录
usermod -aG 组 用户追加附加组
groupadd 组创建用户组
gpasswd -a 用户 组添加用户到组
ls -l查看权限
chmod 755 文件修改权限
chown 用户:组 文件修改所有者和所属组
setfacl -m设置 ACL
getfacl查看 ACL
su - 用户切换用户
sudo 命令以管理员权限执行命令

评论区

文章目录