Linux基础命令方便介绍(四)

Linux是一个多用户多任务系统。它允许很多人同时登录同一台机器,或者让多个程序并行运行。
对于一些文件我们不希望别人能够随意访问或更改,需要对不同用户设置不同权限,Linux系统用账号体系来管理资源访问。

Linux的用户分三类:

  1. 超级用户 root
    系统的上帝,权限最高,能改一切,也能删自己。
  2. 普通用户
    干日常工作,能在自己家(主目录)里折腾,但不能动系统文件。
  3. 程序用户
    一些系统服务(比如www-dataftp)用来运行后台进程,不是给人登录用的。

而组(Group)就像一个团队,组里的每个成员都对该组关联的文件夹具有相同权限

  • 每个用户至少属于一个“基本组”(或叫私有组);
  • 还可以加入多个“附加组”,用来共享文件或权限。

系统用两个数字标识这些身份:

  • UID(User ID)用户标识号
  • GID(Group ID)组标识号

当你执行一个命令时,Linux不会看你叫啥名字,而是通过对应UID和GID来查看。

一、用户与组管理相关命令

1. useradd — 添加用户

基本格式

useradd [选项] 用户名

常用选项(说明 + 示例)

  • -u UID:指定用户的 UID(User ID)。
    示例:useradd -u 1500 alice
  • -g 组名/GID:指定用户的初始(基本)组。
    示例:useradd -g dev alice
  • -G 组1,组2,...:指定附加组(逗号分隔,不带空格)。
    示例:useradd -G sudo,docker alice
  • -d HOME_DIR:指定用户主目录(不指定则默认在 /home/目录下生成一个同名文件夹)。
    示例:useradd -d /ftp/alice alice
  • -m:创建用户主目录(/etc/skel 的内容会被复制)。
    示例:useradd -m alice
  • -M创建主目录(当你希望手动管理主目录时用)。
  • -s shell:指定登录 shell(如 /bin/bash/sbin/nologin)。
    示例:useradd -s /sbin/nologin ftpuser
  • -c "说明文字":用户描述(如真实姓名)。
    示例:useradd -c "小明,开发组" xm
  • -e YYYY-MM-DD(年-月-日):帐号过期日期(到期后不能登录)。
    示例:useradd -e 2025-12-31 tempuser
  • -f DAYS:密码过期后,多少天禁用账户(-1 表示禁用此功能)。
  • -r:创建系统账号(通常 UID 比较小,适用于服务账号)。

示例

useradd -m -s /bin/bash -G devops,git -c "李四" -e 2025-12-31 lisi

创建用户名为lisi的用户,家目录在默认的/home下,其shell登录为bash,附加组为devops,git,用户描述备注是"李四",账号在2025年12月31日过期。


2. passwd — 设置或更改密码

基本格式

passwd [选项] [用户名]

常用选项

  • 不带用户名:修改当前用户密码(会提示输入旧密码)。
  • passwd 用户名:在root账号 修改指定用户的密码。
  • -d 用户名:删除用户密码(允许无需密码登录,通常不安全)。
  • -l 用户名:锁定账户(在/etc/shadow文件对应用户密码字段前加 !*)。
  • -u 用户名:解锁账户。
  • -S 用户名:显示账号状态(是否锁定、最后修改时间等)。
  • --stdin(某些发行版):从标准输入读取密码(常用于脚本,谨慎使用)。

示例

passwd lisi          # 交互式修改 lisi 的密码(root 可执行)
passwd -l baduser    # 锁定 baduser
passwd -u baduser    # 解锁 baduser
passwd -S lisi       # 显示状态

3. usermod — 修改用户属性

基本格式

usermod [选项] 用户名

常用选项

  • -l 新用户名:更改用户名(慎用,需注意主目录、文件所有权)。
  • -d 新主目录:更改主目录位置。通常配合 -m 一起使用。
  • -m:同时移动旧主目录到新主目录(与 -d 联用)。
  • -s SHELL:更改登录 shell。
  • -u UID:更改 UID(注意文件所有权需调整)。
  • -g 基本组:更改用户的初始组。
  • -G 组1,组2,...:设置附加组列表(注意:默认会覆盖原附加组,非追加)。
  • -a:与 -G 联用,追加附加组而不是覆盖(常见组合:usermod -aG docker user)。
  • -e 日期:设置账号过期时间。
  • -L:锁定密码(等同 passwd -l)。
  • -U:解锁密码。

示例

usermod -aG docker alice   # 将 alice 追加到 docker 组(保留已有附加组)
usermod -d /home/newalice -m alice   # 修改并移动主目录

4. userdel — 删除用户

基本格式

userdel [选项] 用户名

常用选项

  • -r:同时删除用户的主目录和邮件箱等。
  • -f:强制删除(在某些系统上可用,谨慎)。

示例

userdel -r tempuser

5. groupadd / groupdel / gpasswd — 组管理

groupadd-创建组

groupadd [选项] 组名

常用选项

  • -g GID:指定组的 GID(Group ID)。
  • -r:创建系统组(较小的 GID)。

示例

groupadd -g 1005 dev

groupdel-删除组

groupdel 组名

gpasswd — 管理组成员与组密码

gpasswd [选项] 组名

常用选项

  • -a 用户 组:向组中添加用户(等同把用户加入该组)。
  • -d 用户 组:从组中删除用户。
  • -M 用户1,用户2:直接设置组成员列表(覆盖)。
  • -r:删除组密码(有些场景下用得少)。
  • -A 管理员列表:设置组管理员。

示例

gpasswd -a alice dev
gpasswd -d alice dev
gpasswd -M alice,bob dev

6. 查询相关:idgroupsfingerwhowusers

  • id [用户名]:显示 UID、GID、附加组及其 ID。
    示例:id aliceuid=1001(alice) gid=1001(alice) groups=1001(alice),27(sudo)
  • groups [用户名]:列出某用户所属的组(简单列表)。
  • finger [用户名]:显示用户详细信息(部分系统默认未安装,需要 finger 包)。显示登录时间、主目录、Shell 等。
  • who:列出当前登录用户(每个会话一行)。
  • w:比 who 更详细,显示用户、登录终端、登录时间、活动和正在运行的命令。
  • users:简洁列出当前登录用户的用户名(不包含其它信息)。

二、权限与所有权管理命令

这些命令直接决定文件/目录谁能做什么,是管理员的日常核心。

1. ls -l(查看权限格式回顾)

示例输出:

-rwxr-sr-- 1 alice dev 1234 2025-01-01 script.sh

解释:

  • 以空格分不同列,第一列 10 个字符:文件类型 + 三组权限(属主、属组、其他)。
  • 第二列链接数;第三列属主;第四列属组;随后是大小和时间。

2. chmod — 修改权限

基本格式

chmod [选项] 模式 文件...

两种表示法

符号表示法(更直观)

chmod [ugoa][+-=][rwx] 文件
  • u:属主(user)
  • g:属组(group)
  • o:其他(others)
  • a:所有人(all,相当于 ugo)
  • +:添加权限
  • -:移除权限
  • =:赋值(覆盖原有权限)
  • rwx:读/写/执行

示例

chmod u+x script.sh      # 给属主添加执行权限
chmod go-w file.txt      # 移除属组和其他写权限
chmod a=r file.txt       # 所有人只读
chmod g+s /data/project  # 给目录设置 setgid,使新建文件继承目录组

数字(八进制)表示法

  • 权限数字:r=4w=2x=1
  • 三位分别代表属主、属组、其他。
    例如 755 = 7(rwx)5(r-x)5(r-x)

示例

chmod 644 file.txt   # -rw-r--r--
chmod 755 script.sh  # rwxr-xr-x

3. chown — 修改属主和属组

基本格式

chown [选项] [属主][:属组] 文件

常用写法

  • chown 用户 文件:修改属主,属组保持不变。
  • chown :组 文件:只改属组。
  • chown 用户:组 文件:同时改属主和属组。
  • -R:递归修改目录及其所有子项。
  • --from=OLD_OWNER:OLD_GROUP:仅当当前属主属组匹配时才替换(用于安全批量变更)。

示例

chown alice:dev report.txt 			# 修改report.txt属主为alice,属组为dev
chown :dev /data/project -R				# 修改/data目录及其子目录project属组为dev
chown -R www-data:www-data /var/www/html

4. umask — 默认权限掩码

基本概念

  • umask 决定新创建文件/目录的默认权限。
  • 系统先设定“最大权限”(目录默认为 777,文件默认为 666),再用 umask 去“减掉”对应位。
  • 例如 umask 022:新目录默认权限 = 777 - 022 = 755;新文件默认 = 666 - 022 = 644

常用操作

  • umask:显示当前 umask 值(通常以八进制显示)。
  • umask 002:同组用户可写(常用于协作组)。
  • umask 077:最严格,其他人无权限(个人隐私环境)。

示例

umask 022
mkdir newdir   # 权限 755
touch newfile  # 权限 644

5. 特殊权限位(setuid / setgid / sticky)

  • setuid(u+s):可执行文件若设置 setuid,运行时以文件属主的身份执行(常用于需要临时提升权限的工具,如部分系统程序)。
  • setgid(g+s):若设置在文件上,运行时以文件属组执行;若设置在目录上,新建文件/目录将继承该目录的组。很有用以便团队共享文件组。
  • sticky(t):常见于 /tmp(权限 1777),意味着目录内文件只能被属主或 root 删除,即使目录对其他人可写。

查看方式
ls -ls, S, t, T 的出现表示这些特殊位。

设置示例

chmod u+s /usr/bin/someprog      # 对可执行文件设置 setuid(谨慎)
chmod g+s /data/shared           # 对共享目录设置 setgid,便于组协作
chmod 1777 /tmp                  # sticky 位 + 全写(/tmp 标准)

四、实战示例与流程(将知识落地)

场景 A:为技术组建立共享目录

需求:技术组 dev 的成员可以读写共享目录,其他人无访问权;新建文件自动归 dev 组。

步骤:

groupadd dev                # 若组不存在则创建
useradd -m -G dev alice
useradd -m -G dev bob
mkdir -p /data/dev_share
chown root:dev /data/dev_share
chmod 2770 /data/dev_share   # 2 -> setgid, 7 -> rwx for owner(root), 7 for group(dev), 0 for others

说明:

  • 2770:设置 setgid(2)使目录中新建文件继承 dev 组;770 让属主和属组可读写执行,其他无权限。

场景 B:给脚本设置只允许属主执行

chown alice:alice /usr/local/bin/myscript.sh
chmod 700 /usr/local/bin/myscript.sh

说明:只有 alice 能读写并执行该脚本,其他人不能访问。

场景 C:备份 /etc 目录并保持属性

cp -a /etc /backup/etc_$(date +%F)
# 或者 rsync -a /etc /backup/etc_YYYY-MM-DD

说明:-a 归档可尽量保留权限、时间戳、符号链接等。


五、常见问题与安全建议(实用小贴士)

  1. 不要随意把用户加入 sudowheel,只有可信任的管理员才能被授权。
  2. **谨慎使用 chmod -R 和 **chown -R,递归可能意外修改大量文件。先用 lsfind 确认目标。
  3. 不要在生产系统上随意设置 setuid 程序,恶意或出错的 setuid 程序会引发安全漏洞。
  4. 避免在脚本中明文存放密码(如 passwd --stdin),脚本应尽量使用安全机制(比如 PAM、密钥或受限交互)。
  5. 常备一个普通用户执行日常任务,只有需要时才切换到 rootsudo)以降低误操作风险。
  6. 使用 umask 002 可在协作组环境下方便组内共享;个人主目录建议 umask 077
  7. 在执行删除或重命名前,先用 lsfindstat 验证目标,尤其是 rm -rf

六、速查表(命令 + 常用选项一览)

  • 用户管理:useradd-m -d -s -g -G -c -u -e)、usermod-aG -d -m -s -u -g)、userdel-r
  • 密码:passwd-d -l -u -S
  • 组管理:groupadd-g)、groupdelgpasswd-a -d -M
  • 查询:idgroupsfingerwhowusers
  • 文件/目录:ls-l -a -h -R -d)、pwdcdmkdir -ptouchln -scp -a -r -pmv -irm -rf
  • 查找:whichfind-name -type -size -mtime -exec -maxdepth
  • 权限与所有权:chmod(符号/数字、-R)、chown-R)、umask
  • 特殊位:setuid、setgid、sticky(u+sg+st

七、结语(给初学者的练习路径)

按这个进阶顺序练习,会让你很快上手并稳固记忆:

  1. 在虚拟机中创建几个普通用户,学习 useraddpasswdusermoduserdel
  2. 建立组并把用户加入/移出,练习 groupaddgpasswd
  3. 创建共享目录并用 chown + chmod 2770 实现组内协作。
  4. 练习 find 查找大文件并配合 du 分析磁盘占用。
  5. 反复练习 chmod 的符号/数字表示法,理解 setuid/setgid/sticky 的场景。
  6. 阅读 /etc/passwd/etc/shadow/etc/group,理解这些文件的结构(但不要随意手动编辑 shadow)。
posted @ 2025-12-07 21:07  clnchanpin  阅读(6)  评论(0)    收藏  举报