目录
前言
Linux系统是一个多用户多任务的分时操作系统,即可通过不同的用户来管理操作系统。我们可以给不同的用户设置不同的权限,来实现不同的需求。而在企业中也是通过创建不同用户,分配不同的权限,这样企业中不同的职位就可根据自己用户权限的大小实现工作中的分工
一、管理用户账号
1、Linux系统中用户账号类型
超级用户(root)
- 权限特点:
- root 用户拥有最高的权限,可以对系统进行任何操作,包括安装软件、修改系统配置文件、创建和删除用户账号等。它不受文件权限和系统访问限制的约束,能够访问和修改系统中的任何文件和目录。
- 例如,root 用户可以使用命令rm -rf /来删除根目录下的所有文件和目录,这是一个极其危险的操作,但也体现了其权限的至高无上。
- 用途:
- 主要用于系统的安装、配置和维护。如安装新的硬件驱动程序、对系统进行升级、设置系统服务等操作通常需要 root 权限。
普通用户
- 权限特点:
- 普通用户的权限受到限制,只能在自己的主目录和被授权的目录中进行操作。他们不能随意修改系统级别的配置文件或访问其他用户的私人文件(除非被授权)。
- 例如,普通用户在尝试修改/etc/passwd等系统关键文件时,会因为权限不足而被拒绝。他们只能对自己拥有读、写和执行权限的文件进行相应操作。
- 用途:
- 用于日常的工作任务,如运行办公软件、浏览网页、编写代码等。普通用户账号可以保证系统的安全性,即使某个普通用户账号被恶意利用,由于其权限有限,对系统造成的损害也相对较小。
系统用户
- 权限特点:
- 系统用户是 Linux 系统为了运行特定的服务或守护进程而创建的用户账号。这些用户通常没有登录 shell,其主要目的是让相关的服务进程能够以特定的用户身份来访问系统资源。
- 例如,httpd服务可能会以apache(系统用户)的身份运行,这个用户对/var/www等相关的网页文件目录有特定的访问权限,用于提供网页服务。
- 用途:
- 用于系统服务的运行,确保每个服务都有独立的身份和权限,增强系统的安全性和稳定性。这样可以避免因某个服务出现安全漏洞而导致整个系统被完全控制。
Linux是一个多用户,多任务,多进程的服务器操作系统
- 用户角色:超级用户(管理员),普通用户,程序用户
- 用户:使用者在计算机内部的身份标识,是计算机用于分配资源的身份标识和依据
2、用户标识UID的分类
Linux 操作系统中的每一个用户账号都有一个数字形式的身份标记,称为用户标识号UID
UID是操作系统区分用户的基本依据,原则上每个用户的UID号应该是唯一,但也可使用useradd的-o选项来允许使用重复的UID创建用户
用户标识号UID的分类:
-
超级用户:root uid=0 gid=0 权限最大(使用需要严谨)。 普通用户:1000<=uid<=60000 受到权限限制,一般在宿主目录下有完整权限 程序用户:1=<uid<=999 应用程序运行时需要通过用户身份获取相应的系统资源,通常不能用于登录系统或管理系统。
操作系统版本 | 用户类型 | UID范围 |
CentOS 6 | 普通用户 | 1~499 |
超级用户 | 固定值为0 | |
程序用户 | 500~60000(可修改) | |
CentOS 7 | 普通用户 | 1000~60000(可修改) |
超级用户 | 固定值为0 | |
程序用户 | 1~999 |
3、用户账号相关文件
3.1 /etc/passwd
情况说明:在 Linux 系统中,/etc/passwd文件是一个文本文件,每行代表一个用户账号的信息。其格式大致如下:用户名:密码:用户标识号:组标识号:注释性描述:主目录:登录shell。用于保存用户名称、宿主目录、登录Shell等基本信息,每一行对应一个用户的账号记录。例如,root:x:0:0:root:/root:/bin/bash是/etc/passwd文件中关于 root 用户的一行记录。
[root@MineGi ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@MineGi ~]#
# 用户名:密码:用户标识号(UID):组标识号(GID):注释性描述:主目录:登录 shell
用于保存用户信息和用户属性的,共7个字段,各字段代表含义:
- “用户名” 是用户登录系统时使用的名称,如 “root”“user1” 等。
- “密码” 字段,在现代 Linux 系统中,密码通常存储在/etc/shadow文件中,这里用 “x” 占位。
- “用户标识号(UID)” 是一个唯一的整数,用于区分不同的用户。root 用户的 UID 通常为 0,普通用户的 UID 从 1000(不同系统可能有所差异)开始。
- “组标识号(GID)” 表示用户所属的主组的标识号,用户可以属于多个组,这里的 GID 是其主组的编号。
- “注释性描述” 可以包含用户的全名、办公室位置等信息。
- “主目录” 是用户登录系统后所在的初始目录,如/home/user1是用户user1的主目录。
- “登录 shell” 指定用户登录后默认使用的 shell 程序,如/bin/bash是常用的登录 shell。
文件的作用
- 用户认证基础:
- 系统在用户登录时会读取/etc/passwd文件来验证用户名是否存在。当用户输入用户名后,系统会在这个文件中查找匹配的记录,作为后续认证过程的第一步。
- 用户信息查询:
- 许多系统管理命令和工具会利用/etc/passwd文件中的信息。例如,id命令用于查看用户的 UID、GID 等信息,它会从/etc/passwd文件中获取这些基本数据来显示给用户。
- 系统配置依据:
- 一些系统服务和应用程序会根据/etc/passwd文件中的用户主目录和登录 shell 等信息来为用户提供合适的环境。比如,当用户登录后,系统会根据登录 shell 启动相应的终端环境,用户在终端中执行命令时,默认的工作目录通常是其主目录。
3.2 /etc/shadow
情况说明:在 Linux 系统中,/etc/passwd文件是一个文本文件,每行代表一个用户账号的信息。其格式大致如下:用户名:密码:用户标识号:组标识号:注释性描述:主目录:登录shell。用于保存用户的密码、账号有效期等信息,每一行对应一个用户的密码记录。例如,对于一个用户账号,一行记录可能类似user1:$6$saltstring$encryptedpassword:18875:0:99999:7:::。
[root@MineGi ~]# head -1 /etc/shadow
root:$6$lkz5C3wAIJXy.XL3$Axv54rjknCBT0n/N5CXRB4ead4sg3o2XOdXAlClRfCCNBgxMGwPWeBIXLsaDPiDXw6gx9KavaAxsxztZYt4k3/::0:99999:7:::
[root@MineGi ~]#
# 用户名:加密后的密码:最后一次修改时间:最小修改间隔:最小修改间隔:警告期:不活动期:失效期:保留字段
密码复杂度:
- 3/4原则:大写字母 小写字母 数字 特殊符号
- 长度:8位
内容共9个字段,目前只启用前8个字段,各字段代表的含义
- “用户名” 与/etc/passwd文件中的用户名相对应,用于关联用户账号。
- “加密后的密码” 采用了加密算法(如 MD5、SHA - 256 等,较新的系统多采用更安全的加密方式)对用户密码进行加密。这里的加密还可能会使用盐值(salt)来增加密码破解的难度。加密的密码,!或!!表示密码被锁定,不能使用
- “最后一次修改时间” 是从 1970 年 1 月 1 日起,到密码最后一次被修改的天数。
- “最小修改间隔” 表示从最后一次修改密码后,至少要经过多少天才能再次修改密码。密码最短有效期(距上次密码修改起多少天内不能再次修改密码)单位"天"。"0"表示随时可修改密码。
- “最大修改间隔” 表示密码最长可以使用的天数,超过这个天数后,系统会强制用户修改密码。密码最长有效期(在修改密码后的多少天必须重新修改密码。99999 表示永久可以使用。)
- “警告期” 是在密码过期前多少天开始提醒用户修改密码。提前多少天警告用户口令将过期(7 表示在密码过期前7天开始警告。)
- “不活动期” 是指密码过期后,用户还可以使用旧密码登录的天数。在密码过期之后多少天禁用此用户。
- “失效期” 是从 1970 年 1 月 1 日起,到账号被禁用的天数。密码过期日期,若设置则显示为过期日期距 1970 年1月1日多少天。
- “保留字段” 目前暂未使用,用于未来扩展。
4、用户账号的初始配置文件
4.1 主要的用户初始配置文件
主目录下的.bashrc 文件
- 作用:
- 这个文件主要用于配置用户的 bash shell 环境。当用户启动一个交互式的 bash shell 时,.bashrc文件中的命令会被执行。它可以设置环境变量、定义别名、配置命令提示符等。
- 例如,用户可以在.bashrc文件中添加alias ll='ls -l',这样在 bash shell 中输入ll就相当于输入ls -l,方便用户操作。
- 内容示例:
- 它可能包含诸如PATH环境变量的设置,如export PATH="$PATH:/home/user/bin",这将用户自定义的/home/user/bin目录添加到可执行文件的搜索路径中。
主目录下的.bash_profile 文件:
- 作用:
- 用于在用户登录时配置 bash shell 环境。当用户通过登录终端或者使用ssh等方式登录系统时,.bash_profile文件中的命令会被执行。它可以用于设置全局的环境变量、启动特定的程序等。
- 例如,它可以用于启动用户自定义的菜单系统或者设置一些与登录相关的安全配置。
- 内容示例:
- 可能包含if [ -f ~/.bashrc ]; then. ~/.bashrc; fi,这表示如果存在.bashrc文件,就执行它,确保.bashrc中的配置也能在登录时生效。
主目录下的.profile 文件(对于非 bash shell):
- 作用:
- 类似于.bash_profile,但它是一个更通用的配置文件,用于为用户登录时的 shell 环境进行初始配置。当用户使用除 bash 以外的其他 shell(如 sh)登录时,.profile文件中的命令会被执行。
- 例如,在一些脚本环境或者特定的系统设置中,需要使用非 bash shell 进行操作,此时.profile文件就起到了初始配置的作用。
- 内容示例:
- 它可能包含对终端类型的设置,如TERMINFO=/usr/share/terminfo; export TERMINFO,这有助于正确地设置终端的显示模式。
主目录下的.bash_logout文件:
- 作用:
- ~/.bash_logout是一个在用户注销登录时执行的配置文件。当用户从 bash shell 环境中注销(例如,通过exit命令或者关闭终端会话)时,系统会读取并执行这个文件中的命令。
- 常见用途:
- 可以在~/.bash_logout文件中添加命令来清理用户在登录期间创建的临时文件或者清除一些特定的环境变量。例如,用户在登录过程中可能会设置一些临时的环境变量用于测试目的,在注销时可以通过unset命令将这些变量清除。
- 如unset TEMP_VARIABLE可以清除名为TEMP_VARIABLE的环境变量。同时,如果用户在/tmp目录下创建了自己的临时文件,也可以添加命令来删除这些文件,如rm -f /tmp/user_temp_file。
- 用于执行一些与注销相关的自定义脚本或命令。例如,用户可能希望在注销时自动备份某些重要的数据文件或者记录注销时间等信息。
- 比如,用户可以在~/.bash_logout文件中添加一个脚本命令,用于将当前工作目录下的重要文件备份到指定的位置,像cp -a ~/important_files ~/backup/这样的命令可以实现备份功能。
简单总结:
- ~/.bash_profile:每次登录时执行
- ~/.bashrc:每次进入新bash环境时执行
- ~/.bash_logout:每次退出登录时执行
- ~/.bash_history:用户登录时从该文件加载历史命令记录
4.2 文件来源和历史命令
- 文件来源
- 新建用户账号时,用户宿主目录内容从 /etc/skel/ 目录中复制而来
- 查看历史命令
- history:查看历史命令信息
- history -c:清除历史命令信息
- 历史命令引用
- !序号
- !命令开头
- Ctrl+r
- 全局初始配置文件,对所有用户生效
- /etc/bashrc
- /etc/profile
- 注意事项
- /etc/profile和~/.bash_profile冲突了,~/.bash_profile的配置覆盖全局文件配置。
echo "echo '***this is login bash_profile***'" >>~/.bash_profile # 写入测试内容
echo "echo '---this is new bash bashrc---'" >>~/.bashrc # 写入测试内容
echo "echo '~~~this is logout bash_logout~~~'" >>~/.bash_logout # 写入测试内容
tail -n1 ~/{.bash_profile,.bashrc,.bash_logout} # 查看写入的内容
wc -l ~/.bash_history # 查看记录历史命令的文件行数
tail -5 ~/.bash_history # 查看记录历史命令的文件后5行内容
logout # 退出连接后,再次连接,三次写入的内容都显示了
history |tail -5 # 查看历史命令的后五个
history |wc -l # 统计一下历史命令的个数
ls /home/;history -c # 执行命令后清空历史命令
history |tail -5 # 查看历史命令的后五个
history |wc -l # 统计一下历史命令的个数
sed -i '$d' ~/{.bash_profile,.bashrc,.bash_logout} # 删除文件的最后一行内容,即删除之前的测试内容
命令示例:
echo "echo '***this is login bash_profile***'" >>~/.bash_profile
echo "echo '---this is new bash bashrc---'" >>~/.bashrc
echo "echo '~~~this is logout bash_logout~~~'" >>~/.bash_logout
tail -n1 ~/{.bash_profile,.bashrc,.bash_logout}
wc -l ~/.bash_history
tail -5 ~/.bash_history
logout
history |tail -5
history |wc -l
ls /home/;history -c
history |tail -5
history |wc -l
sed -i '$d' ~/{.bash_profile,.bashrc,.bash_logout}
输出结果:
[root@MineGi ~]# echo "echo '***this is login bash_profile***'" >>~/.bash_profile
[root@MineGi ~]# echo "echo '---this is new bash bashrc---'" >>~/.bashrc
[root@MineGi ~]# echo "echo '~~~this is logout bash_logout~~~'" >>~/.bash_logout
[root@MineGi ~]# tail -n1 ~/{.bash_profile,.bashrc,.bash_logout}
==> /root/.bash_profile <==
echo '***this is login bash_profile***'
==> /root/.bashrc <==
echo '---this is new bash bashrc---'
==> /root/.bash_logout <==
echo '~~~this is logout bash_logout~~~'
[root@MineGi ~]# wc -l ~/.bash_history
67 /root/.bash_history
[root@MineGi ~]# tail -5 ~/.bash_history
chmod g+s file1.txt
ls -l file1.txt
ls
rm -rf file1.txt
ls
[root@MineGi ~]# logout
~~~this is logout bash_logout~~~
Connection closing...Socket close.
Connection closed by foreign host.
Disconnected from remote host(001-10.4.7.11) at 18:39:14.
Type `help' to learn how to use Xshell prompt.
[C:\~]$
Connecting to 10.4.7.11:22...
Connection established.
To escape to local shell, press Ctrl+Alt+].
WARNING! The remote SSH server rejected X11 forwarding request.
Last login: Fri Jan 3 18:39:00 2025 from 10.4.7.253
---this is new bash bashrc---
***this is login bash_profile***
[root@MineGi ~]# history |tail -5
75 tail -n1 ~/{.bash_profile,.bashrc,.bash_logout}
76 wc -l ~/.bash_history
77 tail -5 ~/.bash_history
78 logout
79 history |tail -5
[root@MineGi ~]# history |wc -l
80
[root@MineGi ~]# ls /home/;history -c
[root@MineGi ~]# history |tail -5
1 history |tail -5
[root@MineGi ~]# history |wc -l
2
[root@MineGi ~]# sed -i '$d' ~/{.bash_profile,.bashrc,.bash_logout}
[root@MineGi ~]#
5、用户账号的管理命令
5.1 useradd命令
基本功能:useradd是 Linux 系统中用于创建新用户账号的命令。它可以在系统中添加一个新的用户,并且可以根据指定的参数为用户设置各种属性,如主目录、用户组、登录 shell 等。注意:在Ubuntu系列系统中使用adduser。若未明确指定用户的宿主目录,则在/home目录下自动创建与该用户账号同名的宿主目录,并在该目录中建立用户的各种初始配置文件。使用useradd命令新建用户其实是在/etc/passwd末尾增加一条该用户账号的记录 ,实际上useradd命令是修改了passwd文件内容。
命令格式:
useradd [选项]... 用户名
选项 | 说明 |
-u | 指定用户的 UID 号,要求该 UID 号码未被其他用户使用 |
-M | 不建立宿主目录,即使/etc/login.defs 系统配置中已设定要建立宿主目录 |
-s | 指定用户登录shell环境 |
-e | 指定用户的账户失效时间,可使用 YYYY-MM-DD 的日期格式 |
-d | 指定用户的宿主目录位置,默认为/home/用户名,(当与-M 一起使用时,不生效) |
-c | 添加用户的备注信息,显示在 /etc/passwd 第五字段 |
-g | 指定用户的基本组名(或使用 GID 号).系统中创建用户时,默认会创建一个同名的基本组 |
-G | 指定用户的附加组名(或使用 GID 号) |
常用参数及示例
- -m(创建主目录):
- 参数含义:在创建用户账号时,自动为用户创建主目录。主目录的默认位置是/home/加上用户名。
- 示例:useradd -m newuser,这条命令会创建一个名为newuser的用户,并在/home/目录下为其创建主目录/home/newuser。
- -g(指定用户所属的主组):
- 参数含义:将用户添加到指定的主组中。主组是用户的主要所属组,会影响用户对文件和资源的访问权限。
- 示例:如果系统中有一个名为developers的组,使用命令useradd -g developers newuser,则newuser会被添加到developers组作为其主组。
- -s(指定登录 shell):
- 参数含义:为用户指定登录后使用的 shell 程序。不同的 shell 有不同的功能和特点,常见的如/bin/bash。
- 示例:useradd -s /bin/zsh newuser,这会使得newuser用户登录系统后默认使用zsh作为登录 shell。
- -u(指定用户 ID):
- 参数含义:手动指定用户的 UID(用户标识号)。在某些特殊情况下,可能需要为用户指定特定的 UID,比如要与其他系统中的用户 ID 保持一致。
- 示例:useradd -u 2000 newuser,这条命令创建的newuser用户的 UID 为 2000。不过要注意,尽量避免与现有用户的 UID 冲突。
useradd user1 # 添加用户 user1
grep user1 /etc/passwd # 查看用户 user1 信息
ls -ld /home/user1 # 查看用户 user1 的家目录
useradd -u 5000 user2 # 添加用户 user2 ,指定 uid 为 5000
grep user2 /etc/passwd # 查看用户 user2 信息
ls -ld /home/user2 # 查看用户 user2 的家目录
useradd -d /tmp/user3 user3 # 添加用户 user3 ,指定家目录的路径为为 /tmp/user3
grep user3 /etc/passwd # 查看用户 user3 信息
ls -ld /home/user3 # 查看用户 user3 的家目录,不存在
ls -ld /tmp/user3 # 查看用户 user3 的家目录,指定的路径
useradd -M -s /sbin/nologin user4 # 添加用户 user4 ,指定登录 shell 为 /sbin/nologin ,并不创建家目录
grep user4 /etc/passwd # 查看用户 user4 信息
ls -ld /home/user4 # 查看用户 user4 的家目录,不存在
useradd -e "3000-01-01" user5 # 添加用户 user5 ,指定失效时间为 3000-01-01
grep user5 /etc/passwd # 查看用户 user5 信息
grep user5 /etc/shadow # 查看用户 user5 信息
tail -5 /etc/passwd # 查看后5行内容,对比一下
tail -5 /etc/shadow # 查看后5行内容,对比一下
命令示例:
useradd user1
grep user1 /etc/passwd
ls -ld /home/user1
useradd -u 5000 user2
grep user2 /etc/passwd
ls -ld /home/user2
useradd -d /tmp/user3 user3
grep user3 /etc/passwd
ls -ld /home/user3
ls -ld /tmp/user3
useradd -M -s /sbin/nologin user4
grep user4 /etc/passwd
ls -ld /home/user4
useradd -e "3000-01-01" user5
grep user5 /etc/passwd
grep user5 /etc/shadow
tail -5 /etc/passwd
tail -5 /etc/shadow
输出结果:
[root@MineGi ~]# useradd user1
[root@MineGi ~]# grep user1 /etc/passwd
user1:x:1000:1000::/home/user1:/bin/bash
[root@MineGi ~]# ls -ld /home/user1
drwx------ 2 user1 user1 62 1月 4 08:33 /home/user1
[root@MineGi ~]# useradd -u 5000 user2
[root@MineGi ~]# grep user2 /etc/passwd
user2:x:5000:5000::/home/user2:/bin/bash
[root@MineGi ~]# ls -ld /home/user2
drwx------ 2 user2 user2 62 1月 4 08:34 /home/user2
[root@MineGi ~]# useradd -d /tmp/user3 user3
[root@MineGi ~]# grep user3 /etc/passwd
user3:x:5001:5001::/tmp/user3:/bin/bash
[root@MineGi ~]# ls -ld /home/user3
ls: 无法访问/home/user3: 没有那个文件或目录
[root@MineGi ~]# ls -ld /tmp/user3
drwx------ 2 user3 user3 62 1月 4 08:34 /tmp/user3
[root@MineGi ~]# useradd -e "3000-01-01" user5
[root@MineGi ~]# grep user5 /etc/passwd
user5:x:5002:5002::/home/user5:/bin/bash
[root@MineGi ~]# grep user5 /etc/shadow
user5:!!:20092:0:99999:7::376200:
[root@MineGi ~]# tail -5 /etc/passwd
tcpdump:x:72:72::/:/sbin/nologin
user1:x:1000:1000::/home/user1:/bin/bash
user2:x:5000:5000::/home/user2:/bin/bash
user3:x:5001:5001::/tmp/user3:/bin/bash
user5:x:5002:5002::/home/user5:/bin/bash
[root@MineGi ~]# tail -5 /etc/shadow
tcpdump:!!:20049::::::
user1:!!:20092:0:99999:7:::
user2:!!:20092:0:99999:7:::
user3:!!:20092:0:99999:7:::
user5:!!:20092:0:99999:7::376200:
[root@MineGi ~]#
5.2 passwd命令
基本功能:passwd命令用于更改用户的密码。在 Linux 和 Unix 系统中,这是一个非常重要的命令,它允许普通用户修改自己的密码,超级用户(root)可以修改任何用户的密码。如果不指定用户名,默认修改的是当前登录用户的密码,普通用户可以修改自己的密码,root 可以修改任意用户的密码。
命令格式:
passwd [选项]... [用户名]
普通用户使用方式
- 普通用户在终端中输入passwd后,系统会提示用户输入旧密码(如果有的话),然后要求输入新密码两次,以确保新密码输入正确。例如:
- 当用户在终端输入passwd后,系统可能会出现以下提示:
- Changing password for user [username].(为用户 [用户名] 更改密码。)
- (current) UNIX password:(当前 UNIX 密码:)
- 用户输入旧密码后,会看到:New UNIX password:(新 UNIX 密码:)和Retype new UNIX password:(再次输入新 UNIX 密码:)
- 当用户在终端输入passwd后,系统可能会出现以下提示:
- 新密码需要满足一定的安全要求,通常包括长度、字符种类(如包含字母、数字、特殊字符)等。如果新密码不符合要求,系统会提示错误并要求重新输入。
超级用户(root)使用方式
- root 用户使用passwd命令时,可以直接为其他用户设置密码,不需要知道旧密码。例如,root用户要为user1设置密码,可以在终端输入passwd user1,然后按照系统提示输入新密码两次即可。
- 这种方式在忘记用户密码或者需要为新用户初始设置密码时非常有用。
相关参数
- -l(锁定用户账户):
- 只有 root 用户可以使用此参数。例如,passwd -l user1会锁定user1账户,使该用户无法登录,直到账户被解锁。被锁定账户的密码前面会被添加一个!标记(在/etc/shadow文件中)。
- -u(解锁用户账户):
- 同样只有 root 用户可以使用。用于解锁被锁定的用户账户。例如,passwd -u user1可以解锁之前被锁定的user1账户。
- -d(删除用户密码):
- root 用户使用此参数可以删除用户的密码。例如,passwd -d user1会将user1用户的密码删除,这样用户下次登录时就不需要密码,但这种操作存在安全风险,需要谨慎使用。
- -S(查看用户密码状态):
- root 用户可以通过这个参数查看用户密码的状态,包括密码是否被设置、账户是否被锁定等信息。例如,passwd -S user1会返回关于user1用户密码状态的信息,如user1 PS 2023 - 01 - 01 0 99999 7 -1 (Password set, MD5 crypt.),这些信息可以帮助管理员了解用户账户的情况。
选项 | 说明 |
-l | 锁定用户账号 |
-u | 解锁用户密码 |
-S | 查看用户账号的状态(是否被锁定) |
-d | 清空用户密码(和不设置密码不一样) |
-u | 解锁用户账号 |
-x, --maximum=DAYS | 密码的最长有效时限 |
-n, --minimum=DAYS | 密码的最短有效时限 |
-w, --warning=DAYS | 在密码过期前多少天开始提醒用户 |
-i, --inactive=DAYS | 当密码过期后经过多少天该帐号会被禁用 |
echo 666666 |passwd user1 --stdin # 设置密码,不用交互
getent shadow user1 # 查看用户 user1 的信息
passwd -d user1 # 清空用户密码
passwd -l user1 # 锁定用户,有两个叹号
passwd -S user1 # 查看用户账号的状态(是否被锁定)
passwd -uf user1 # 解锁用户账号,-f选项强制解锁
passwd user1 # 设置密码,需要交互
passwd -u user1 # 解锁用户账号
命令示例:
getent shadow user1
passwd -S user1
passwd -d user1
getent shadow user1
passwd -S user1
passwd -l user1
getent shadow user1
passwd -S user1
passwd -u user1
getent shadow user1
passwd -S user1
passwd -uf user1
passwd -S user1
getent shadow user1
passwd user1
passwd -S user1
getent shadow user1
passwd -l user1
getent shadow user1
passwd -u user1
getent shadow user1
passwd -d user1
getent shadow user1
echo 666666 |passwd user1 --stdin
getent shadow user1
passwd -S user1
输出结果:
[root@MineGi ~]# getent shadow user1
user1:!!:20092:0:99999:7:::
[root@MineGi ~]# passwd -S user1
user1 LK 2025-01-04 0 99999 7 -1 (密码已被锁定。)
[root@MineGi ~]# passwd -d user1
清除用户的密码 user1。
passwd: 操作成功
[root@MineGi ~]# getent shadow user1
user1::20092:0:99999:7:::
[root@MineGi ~]# passwd -S user1
user1 NP 2025-01-04 0 99999 7 -1 (密码为空。)
[root@MineGi ~]# passwd -l user1
锁定用户 user1 的密码 。
passwd: 操作成功
[root@MineGi ~]# getent shadow user1
user1:!!:20092:0:99999:7:::
[root@MineGi ~]# passwd -S user1
user1 LK 2025-01-04 0 99999 7 -1 (密码已被锁定。)
[root@MineGi ~]# passwd -u user1
解锁用户 user1 的密码。
passwd: 警告:未锁定的密码将是空的。
passwd: 不安全的操作(使用 -f 参数强制进行该操作)
[root@MineGi ~]# getent shadow user1
user1:!!:20092:0:99999:7:::
[root@MineGi ~]# passwd -S user1
user1 LK 2025-01-04 0 99999 7 -1 (密码已被锁定。)
[root@MineGi ~]# passwd -uf user1
解锁用户 user1 的密码。
passwd: 操作成功
[root@MineGi ~]# passwd -S user1
user1 NP 2025-01-04 0 99999 7 -1 (密码为空。)
[root@MineGi ~]# getent shadow user1
user1::20092:0:99999:7:::
[root@MineGi ~]# passwd user1
更改用户 user1 的密码 。
新的 密码:
无效的密码: 密码是一个回文
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@MineGi ~]# passwd -S user1
user1 PS 2025-01-04 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
[root@MineGi ~]# getent shadow user1
user1:$6$6svNNnS3$8k8L2MUKqOCKDKQBEQB4gLmLwG.EUr2N4aPEhUZqkc5NIub2wwL6xXNs/Sr5Gzlnl10nuFgA5nIdUJWZtiCci/:20092:0:99999:7:::
[root@MineGi ~]# passwd -l user1
锁定用户 user1 的密码 。
passwd: 操作成功
[root@MineGi ~]# getent shadow user1
user1:!!$6$6svNNnS3$8k8L2MUKqOCKDKQBEQB4gLmLwG.EUr2N4aPEhUZqkc5NIub2wwL6xXNs/Sr5Gzlnl10nuFgA5nIdUJWZtiCci/:20092:0:99999:7:::
[root@MineGi ~]# passwd -u user1
解锁用户 user1 的密码。
passwd: 操作成功
[root@MineGi ~]# getent shadow user1
user1:$6$6svNNnS3$8k8L2MUKqOCKDKQBEQB4gLmLwG.EUr2N4aPEhUZqkc5NIub2wwL6xXNs/Sr5Gzlnl10nuFgA5nIdUJWZtiCci/:20092:0:99999:7:::
[root@MineGi ~]# passwd -d user1
清除用户的密码 user1。
passwd: 操作成功
[root@MineGi ~]# getent shadow user1
user1::20092:0:99999:7:::
[root@MineGi ~]# echo 666666 |passwd user1 --stdin
更改用户 user1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@MineGi ~]# getent shadow user1
user1:$6$1TWpxLvB$.JKrvuEwhoBdBohvr./AP0XuDR.L9qoMr5v0HKsYWPM8Hoy2YtIaRteCm9eg7YOHGShZwt1QrZm7cIhXfsrnV/:20092:0:99999:7:::
[root@MineGi ~]# passwd -S user1
user1 PS 2025-01-04 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
[root@MineGi ~]#
5.3 usermod命令
基本功能:usermod命令用于修改用户账户的各种属性。这是一个强大的系统管理命令,通过它可以对用户账户进行多种修改,如更改用户所属组、主目录、登录 shell 等信息。
命令格式:
usermod [选项] … 用户名
常用参数及示例
- -c(修改用户注释):
- 参数含义:用于修改用户账户的注释信息,该注释信息可以包含用户的全名、办公室位置等内容。
- 示例:usermod -c "John Doe, Developer" user1,这条命令将user1用户的注释信息修改为 “John Doe, Developer”。
- -d(修改用户主目录):
- 参数含义:更改用户的主目录。主目录是用户登录系统后所在的初始目录。
- 示例:usermod -d /home/newdir user1,此命令将user1用户的主目录从原来的位置修改到/home/newdir。需要注意的是,如果指定的新主目录不存在,需要先创建该目录,否则用户可能无法正常登录。
- -g(修改用户所属的主组):
- 参数含义:将用户添加到指定的主组中。主组会影响用户对文件和资源的访问权限。
- 示例:如果系统中有一个名为developers的组,使用命令usermod -g developers user1,则user1会被添加到developers组作为其主组。
- -G(修改用户所属的附加组):
- 参数含义:将用户添加到指定的附加组列表中,用户可以属于多个组,通过这个参数可以修改用户所属的附加组。与-g参数不同,-G用于添加或修改附加组,而-g用于修改主组。
- 示例:usermod -G group1,group2 user1,会将user1用户添加到group1和group2这两个附加组中。如果要从附加组中删除用户,可以结合-G和-a(--append 的缩写)参数使用,例如usermod -G "" -a user1会将user1用户从所有附加组中删除。
- -s(修改用户登录 shell):
- 参数含义:为用户指定登录后使用的 shell 程序。不同的 shell 有不同的功能和特点,常见的如/bin/bash。
- 示例:usermod -s /bin/zsh user1,这会使得user1用户登录系统后默认使用zsh作为登录 shell。
- -u(修改用户 ID):
- 参数含义:手动指定用户的 UID(用户标识号)。在某些特殊情况下,可能需要为用户指定特定的 UID,比如要与其他系统中的用户 ID 保持一致。
- 示例:usermod -u 2000 user1,这条命令修改user1用户的 UID 为 2000。不过要注意,尽量避免与现有用户的 UID 冲突。
选项 | 说明 |
-l | 更改已有用户账号的登录名 |
-L | 锁定用户账号 |
-U | 解锁用户账号 |
-u | 修改用户的 UID 号,要求该 UID 号码未被其他用户使用 |
-M | 不建立宿主目录,即使/etc/login.defs 系统配置中已设定要建立宿主目录 |
-s | 修改用户的登录 Shell |
-e | 修改用户的账户失效时间,可使用 YYYY-MM-DD 的日期格式 |
-d | 修改用户的宿主目录位置(当与-M 一起使用时,不生效) |
-c | 修改用户的备注信息 |
-g | 修改用户的基本组名(或使用 GID 号) |
-G | 修改用户的附加组名(或使用 GID 号) |
getent shadow user1 # 查看用户信息
usermod -L user1 # 锁定用户账号,一个叹号
usermod -U user1 # 解锁用户账号
usermod -l new_user1 user1 # 更改已有用户账号的登录名
命令示例:
getent shadow user1
usermod -L user1
getent shadow user1
usermod -U user1
getent shadow user1
usermod -l new_user1 user1
getent shadow user1
getent shadow new_user1
getent passwd new_user1
输出结果:
[root@MineGi ~]# getent shadow user1
user1:$6$1TWpxLvB$.JKrvuEwhoBdBohvr./AP0XuDR.L9qoMr5v0HKsYWPM8Hoy2YtIaRteCm9eg7YOHGShZwt1QrZm7cIhXfsrnV/:20092:0:99999:7:::
[root@MineGi ~]# usermod -L user1
[root@MineGi ~]# getent shadow user1
user1:!$6$1TWpxLvB$.JKrvuEwhoBdBohvr./AP0XuDR.L9qoMr5v0HKsYWPM8Hoy2YtIaRteCm9eg7YOHGShZwt1QrZm7cIhXfsrnV/:20092:0:99999:7:::
[root@MineGi ~]# usermod -U user1
[root@MineGi ~]# getent shadow user1
user1:$6$1TWpxLvB$.JKrvuEwhoBdBohvr./AP0XuDR.L9qoMr5v0HKsYWPM8Hoy2YtIaRteCm9eg7YOHGShZwt1QrZm7cIhXfsrnV/:20092:0:99999:7:::
[root@MineGi ~]# usermod -l new_user1 user1
[root@MineGi ~]# getent shadow user1
[root@MineGi ~]# getent shadow new_user1
new_user1:$6$1TWpxLvB$.JKrvuEwhoBdBohvr./AP0XuDR.L9qoMr5v0HKsYWPM8Hoy2YtIaRteCm9eg7YOHGShZwt1QrZm7cIhXfsrnV/:20092:0:99999:7:::
[root@MineGi ~]# getent passwd new_user1
new_user1:x:1000:1000::/home/user1:/bin/bash
[root@MineGi ~]#
5.4 userdel命令
基本功能:userdel命令主要用于删除用户账号。它可以从系统的用户数据库(如/etc/passwd和/etc/shadow)中删除用户的相关记录,从而使该用户账号无法再用于登录系统。
命令格式:
userdel 用户名
常用参数及示例
- -r(删除用户主目录和邮件目录):
- 参数含义:在删除用户账号的同时,删除用户的主目录(通常位于/home目录下,格式为/home/用户名)以及用户的邮件目录(如果存在)。这是一个比较彻底的删除方式,可以清理与用户相关的大部分文件和目录。
- 示例:userdel -r user1,此命令会删除user1这个用户账号,并且同时删除/home/user1目录以及与之相关的邮件目录(如果有)。如果不使用-r参数,仅执行userdel user1,那么只会删除用户账号的系统记录,用户的主目录和邮件目录等文件仍然会保留在系统中。
- 注意事项:
- 谨慎使用userdel -r参数,因为一旦执行,用户主目录中的所有文件和数据都将被永久删除。在删除用户账号之前,最好先备份用户主目录中的重要数据。
- 如果用户当前正在登录系统,通常无法直接删除该用户账号。需要先让用户退出登录,或者使用kill命令(谨慎使用)终止与该用户相关的所有进程后,才能成功删除用户账号。
- 常用选项:
- -r:删除用户的同时删除用户的宿主目录
ls -ld /home/user2 # 列出用户家目录
ls -ld /var/spool/mail/user2 # 列出用户邮箱目录
userdel user2 # 删除用户
useradd user2 # 添加用户
id user2 # 查看信息
userdel -r user2 # 删除用户的同时删除用户的宿主目录
rm -rf /home/user2 /var/spool/mail/user2 # 手动删除
getent passwd user3 # 查看信息
命令示例:
ls -ld /home/user2
ls -ld /var/spool/mail/user2
userdel user2
ls -ld /home/user2
ls -ld /var/spool/mail/user2
useradd user2
id user2
userdel -r user2
ls -ld /home/user2
ls -ld /var/spool/mail/user2
id user2
rm -rf /home/user2 /var/spool/mail/user2
getent passwd user3
ls -ld /tmp/user3
ls -ld /var/spool/mail/user3
userdel -r user3
ls -ld /tmp/user3
ls -ld /var/spool/mail/user3
输出结果:
[root@MineGi ~]# ls -ld /home/user2
drwx------ 2 user2 user2 62 1月 4 08:34 /home/user2
[root@MineGi ~]# ls -ld /var/spool/mail/user2
-rw-rw---- 1 user2 mail 0 1月 4 08:34 /var/spool/mail/user2
[root@MineGi ~]# userdel user2
[root@MineGi ~]# ls -ld /home/user2
drwx------ 2 5000 5000 62 1月 4 08:34 /home/user2
[root@MineGi ~]# ls -ld /var/spool/mail/user2
-rw-rw---- 1 5000 mail 0 1月 4 08:34 /var/spool/mail/user2
[root@MineGi ~]# useradd user2
useradd:警告:此主目录已经存在。
不从 skel 目录里向其中复制任何文件。
正在创建信箱文件: 文件已存在
[root@MineGi ~]# id user2
uid=5003(user2) gid=5003(user2) 组=5003(user2)
[root@MineGi ~]# userdel -r user2
userdel:/var/spool/mail/user2 并不属于 user2,所以不会删除
userdel:/home/user2 并不属于 user2,所以不会删除
[root@MineGi ~]# ls -ld /home/user2
drwx------ 2 5000 5000 62 1月 4 08:34 /home/user2
[root@MineGi ~]# ls -ld /var/spool/mail/user2
-rw-rw---- 1 5000 mail 0 1月 4 08:34 /var/spool/mail/user2
[root@MineGi ~]# id user2
id: user2: no such user
[root@MineGi ~]# rm -rf /home/user2 /var/spool/mail/user2
[root@MineGi ~]# getent passwd user3
user3:x:5001:5001::/tmp/user3:/bin/bash
[root@MineGi ~]# ls -ld /tmp/user3
drwx------ 2 user3 user3 62 1月 4 08:34 /tmp/user3
[root@MineGi ~]# ls -ld /var/spool/mail/user3
-rw-rw---- 1 user3 mail 0 1月 4 08:34 /var/spool/mail/user3
[root@MineGi ~]# userdel -r user3
[root@MineGi ~]# ls -ld /tmp/user3
ls: 无法访问/tmp/user3: 没有那个文件或目录
[root@MineGi ~]# ls -ld /var/spool/mail/user3
ls: 无法访问/var/spool/mail/user3: 没有那个文件或目录
[root@MineGi ~]#
6、关于用户及密码相关控制文件
6.1 /etc/login.defs
[root@MineGi ~]# grep -Ev "^$|^#" /etc/login.defs
MAIL_DIR /var/spool/mail #用户邮件存放目录
PASS_MAX_DAYS 99999 #密码默认最长有效期
PASS_MIN_DAYS 0 #密码默认最短有效期
PASS_MIN_LEN 5 #密码默认长度
PASS_WARN_AGE 7 #密码过期警告时间
UID_MIN 1000 #普通用户起始UID范围
UID_MAX 60000 #普通用户结束UID范围
SYS_UID_MIN 201 #系统用户起始UID范围
SYS_UID_MAX 999 #系统用户结束UID范围
GID_MIN 1000 #普通组起始GID范围
GID_MAX 60000 #普通组结束GID范围
SYS_GID_MIN 201 #系统组起始GID范围
SYS_GID_MAX 999 #系统组结束GID范围
CREATE_HOME yes #是否创建用户宿主目录
UMASK 077 #用户宿主目录默认权限
USERGROUPS_ENAB yes #表示userdel删除用户时,如果该用户用户组如果没有成员存在,则会删除该用户组
ENCRYPT_METHOD SHA512 #表示用户密码加密方式,此处表示用MD5加密密码
6.2 /etc/default/useradd
[root@MineGi ~]# grep -Ev "^$|^#" /etc/default/useradd
GROUP=100
HOME=/home #把用户的主目录建在/home中
INACTIVE=-1 #是否启用帐号过期停权,-1表示不启用
EXPIRE= #帐号终止日期,不设置表示不启用;
SHELL=/bin/bash #所用SHELL的类型;
SKEL=/etc/skel #默认添加用户的目录默认文件存放位置;也就是说,当我们用adduser添加用户时,用户家目录下的文件,都是从这个目录中复制过去的
/lib64/security/pam_cracklib.so #控制密码复杂度的关键文件,Redhat公司专门开发了cracklib这个安装包来判断密码的复杂度。
[root@MineGi ~]# man pam_cracklib
retry=N #改变输入密码的次数,默认值是1。就是说,如果用户输入的密码强度不够就退出。可以使用这个选项设置输入的次数,以免一切都从头再来
minlen=N #新密码最低可接受的长度
difok=N #默认值为10。这个参数设置允许的新、旧密码相同字符的个数。不过,如果新密码中1/2的字符和旧密码不同,则新密码被接受
dcredit=N #限制新密码中至少有多少个数字
ucredit=N #限制新密码中至少有多少个大写字符。
lcredit=N #限制新密码中至少有多少个小写字符。
二、组账号管理
1、组账号概述
- 组概述:
- 用户集合,组的存在便于管理多个用户的权限
- 组账号分类:
- 基本组(私有组):基本组账号只有一个,一般为创建用户时指定的组
- 附加组(公共组): 用户除了基本组以外,额外添加指定的组
2、组标识号GID的分类
用户标识号GID的分类
操作系统版本 | 用户类型 | GID范围 |
CentOS 6 | 普通用户 | 1~499 |
超级用户 | 固定值为0 | |
程序用户 | 500~60000(可修改) | |
CentOS 7 | 普通用户 | 1000~60000(可修改) |
超级用户 | 固定值为0 | |
程序用户 | 1~999 |
3、组账号相关文件
- /etc/group:保存组账号基本信息
- /etc/gshadow:保存组账号的密码信息(较少使用)
[root@MineGi ~]# head -1 /etc/group
root:x:0:
[root@MineGi ~]# head -1 /etc/gshadow
root:::
[root@MineGi ~]#
- 第1个字段:组名
- 第2个字段:密码占位符
- 第3个字段:GID
- 第4个字段:组内的成员信息
4、组账号的管理命令
4.1 groupadd命令
基本介绍
- groupadd命令用于在 Linux 系统中创建新的用户组。用户组是一种将多个用户组织在一起的方式,方便对用户进行统一的权限管理等操作。
语法格式
- 基本语法为groupadd [选项] 组名。
常用选项
- -g:指定用户组的组 ID(GID)。例如groupadd -g 1001 newgroup,这里创建了一个名为newgroup的用户组,并且指定其组 ID 为 1001。不过要注意,不能使用已经被其他用户组占用的 GID。
- -r:创建系统用户组。系统用户组的 GID 一般小于 1000,用于系统进程等相关用途。如groupadd -r systemgroup会创建一个系统用户组。
示例说明
- 简单创建一个用户组testgroup,可以使用命令groupadd testgroup。创建成功后,该用户组的相关信息会被存储在/etc/group和/etc/gshadow文件中。/etc/group文件存储了用户组的基本信息,包括组名、组密码(一般是 x,表示加密存储)、组 ID 和组成员列表等;/etc/gshadow文件用于存储用户组的加密密码等更安全相关的信息。
命令示例:
groupadd -g 10010 group1
groupadd -g 10086 group2
tail /etc/group
输出结果:
[root@MineGi ~]# groupadd -g 10010 group1
[root@MineGi ~]# groupadd -g 10086 group2
[root@MineGi ~]# tail /etc/group
ssh_keys:x:997:
sshd:x:74:
postdrop:x:90:
postfix:x:89:
chrony:x:996:
tcpdump:x:72:
user1:x:1000:
user5:x:5002:
group1:x:10010:
group2:x:10086:
[root@MineGi ~]#
4.2 gpasswd命令
基本介绍
- gpasswd命令用于管理用户组的密码和成员,在 Linux 系统的用户组管理中发挥重要作用。
语法格式
- 基本语法为gpasswd [选项] 组名。
常用选项及功能
- -a:将用户添加到指定的用户组。例如,gpasswd -a user1 group1会把用户user1添加到group1用户组中。
- -d:从指定的用户组中删除用户。比如gpasswd -d user2 group2会将用户user2从group2用户组里删除。
- -A:指定用户组的管理员。例如gpasswd -A admin_user group3会让admin_user成为group3用户组的管理员,管理员可以管理该组的成员等操作。
- -r:删除用户组的密码。例如gpasswd -r group4会把group4用户组的密码删除。
- -M:设置用户组的成员列表,用逗号分隔多个成员。例如gpasswd -M user3,user4,user5 group5会将user3、user4和user5设置为group5用户组的成员。
示例说明
- 假设要为developers用户组添加一个新成员new_dev,可以使用命令gpasswd -a new_dev developers。如果要删除用户组testers中的成员old_tester,可以使用gpasswd -d old_tester testers。这些操作有助于精确地控制用户在不同用户组中的归属,从而实现对用户权限的精细化管理。
命令示例:
tail -2 /etc/group
tail -2 /etc/passwd
gpasswd -a user5 group1
grep group1 /etc/group
gpasswd -a new_user1 group1
grep group1 /etc/group
gpasswd -d new_user1 group1
grep group1 /etc/group
gpasswd -d user5 group1
grep group1 /etc/group
tail -2 /etc/passwd
tail -2 /etc/group
gpasswd -M user5,new_user1,not_exist group1
tail -2 /etc/group
gpasswd -M user5,new_user1 group1
tail -2 /etc/group
输出结果:
[root@MineGi ~]# tail -2 /etc/group
group1:x:10010:
group2:x:10086:
[root@MineGi ~]# tail -2 /etc/passwd
user5:x:5002:5002::/home/user5:/bin/bash
new_user1:x:1000:1000::/home/user1:/bin/bash
[root@MineGi ~]# gpasswd -a user5 group1
正在将用户“user5”加入到“group1”组中
[root@MineGi ~]# grep group1 /etc/group
group1:x:10010:user5
[root@MineGi ~]# gpasswd -a new_user1 group1
正在将用户“new_user1”加入到“group1”组中
[root@MineGi ~]# grep group1 /etc/group
group1:x:10010:user5,new_user1
[root@MineGi ~]# gpasswd -d user5 group1
正在将用户“user5”从“group1”组中删除
[root@MineGi ~]# grep group1 /etc/group
group1:x:10010:new_user1
[root@MineGi ~]# tail -2 /etc/passwd
user5:x:5002:5002::/home/user5:/bin/bash
new_user1:x:1000:1000::/home/user1:/bin/bash
[root@MineGi ~]# tail -2 /etc/group
group1:x:10010:new_user1
group2:x:10086:
[root@MineGi ~]# gpasswd -M user5,new_user1,not_exist group1
gpasswd:用户“not_exist”不存在
[root@MineGi ~]# tail -2 /etc/group
group1:x:10010:new_user1
group2:x:10086:
[root@MineGi ~]# gpasswd -M user5,new_user1 group1
[root@MineGi ~]# tail -2 /etc/group
group1:x:10010:user5,new_user1
group2:x:10086:
[root@MineGi ~]#
4.3 groupdel命令
功能概述
- groupdel命令用于在 Linux 系统中删除指定的用户组。当一个用户组不再需要时,可以使用该命令将其删除。不过需要注意的是,如果该用户组是某个用户的主用户组,且该用户当前已登录,那么通常无法直接删除这个用户组。
语法格式
- 其语法格式为groupdel [组名],其中 “组名” 是要删除的用户组的名称。例如groupdel test_group,这条命令尝试删除名为test_group的用户组。
注意事项
- 若要删除的用户组是某个用户的主用户组,且该用户仍处于登录状态,系统会提示无法删除该用户组。这是因为用户的主用户组信息关联到用户的很多系统操作,随意删除可能会导致用户操作出现异常。
- 当用户组被删除后,该用户组在/etc/group和/etc/gshadow文件中的记录也会被移除。其中/etc/group文件存储用户组的基本信息,包括组名、组密码、组 ID 和组成员列表等;/etc/gshadow文件存储用户组的加密密码等安全相关信息。所以在删除用户组之前,要确保该用户组确实不再需要,并且已经妥善处理了与该用户组相关的用户权限等事宜。
命令示例:
tail -2 /etc/group
groupdel group2
tail -2 /etc/group
groupdel group1
tail -2 /etc/group
输出结果:
[root@MineGi ~]# tail -2 /etc/group
group1:x:10010:user5,new_user1
group2:x:10086:
[root@MineGi ~]# groupdel group2
[root@MineGi ~]# tail -2 /etc/group
user5:x:5002:
group1:x:10010:user5,new_user1
[root@MineGi ~]# groupdel group1
[root@MineGi ~]# tail -2 /etc/group
user1:x:1000:
user5:x:5002:
[root@MineGi ~]#
三、查询命令
1、id命令
基本功能
- id命令用于显示用户或用户组的相关信息,包括用户 ID(UID)、用户组 ID(GID)以及所属的用户组列表等。
语法格式
- 基本语法是id [选项] [用户名]。其中 “选项” 可以用来指定显示的信息细节,“用户名” 是要查询信息的对象,如果不提供用户名,则默认显示当前用户的相关信息。
常用选项及含义
- -u:只显示用户 ID(UID)。例如,id -u user1会显示用户user1的 UID。
- -g:只显示用户的主用户组 ID(GID)。比如,id -g user2会输出用户user2的主用户组的 GID。
- -G:显示用户所属的所有用户组的 ID。例如id -G user3会列出用户user3所属的所有用户组的 ID,这些组 ID 之间用空格分隔。
- -n:和-u、-g、-G等选项结合使用时,显示名称而不是数字 ID。例如,id -Gn user4会显示用户user4所属的所有用户组的名称。
示例说明
- 若想查看当前用户的 UID 和所有所属用户组的 GID,可以使用命令id -uG。如果要查看用户alice所属的用户组名称,可以使用id -Gn alice。这些信息对于系统管理员在进行权限管理和用户账户管理时非常有用,能够帮助他们准确地了解用户在系统中的权限范围。
命令示例:
id root
id user5
id new_user1
输出结果:
[root@MineGi ~]# id root
uid=0(root) gid=0(root) 组=0(root)
[root@MineGi ~]# id user5
uid=5002(user5) gid=5002(user5) 组=5002(user5)
[root@MineGi ~]# id new_user1
uid=1000(new_user1) gid=1000(user1) 组=1000(user1)
[root@MineGi ~]#
2、groups命令
功能描述
- groups命令用于显示用户所属的用户组。它是一个简单而实用的工具,可以快速查看用户在系统中所属的各个用户组情况。
语法格式
- 基本语法为groups [用户名]。如果不指定用户名,则默认显示当前用户所属的用户组。
示例说明
- 假设当前用户是user1,直接在终端输入groups,会显示user1所属的所有用户组,例如可能会输出user1 : group1 group2 group3,这表明用户user1属于group1、group2和group3这三个用户组。
- 如果要查看另一个用户(如user2)所属的用户组,可以使用命令groups user2,系统会显示user2所属的用户组相关信息。这种功能在权限分配和用户管理场景中很有用,比如在设置文件或目录的访问权限时,需要知道用户所属的用户组,以确定是否可以通过用户组权限来访问。
命令示例:
groups root
groups user5
groups new_user1
输出结果:
[root@MineGi ~]# groups root
root : root
[root@MineGi ~]# groups user5
user5 : user5
[root@MineGi ~]# groups new_user1
new_user1 : user1
[root@MineGi ~]#
3、finger命令
基本介绍
- finger命令用于查询用户的相关信息,包括用户的登录名、真实姓名、主目录、登录 Shell、最后登录时间等诸多细节内容。它是一个在 Linux 等系统中方便查看用户信息的工具。
语法格式
- 基本语法是finger [选项] [用户名]。可以使用选项来指定查询信息的范围等细节内容,“用户名” 是要查询信息的对象,如果不提供用户名,则按照系统默认规则进行查询,通常是显示当前登录用户的信息。
常用选项及功能
- -l:以长格式显示用户信息。这种格式会提供更详细的内容,如用户的完整主目录、登录 Shell 的完整路径等信息。
- -s:以短格式显示用户信息。相比长格式,它会省略一些细节,只提供一些关键信息,如登录名、真实姓名、终端名、空闲时间、登录时间等。
示例说明
- 若要查看用户user1的详细信息,可以使用命令finger -l user1。如果只是想快速浏览一下用户user1的基本信息,如登录名、登录时间等,可以使用finger -s user1。不过需要注意的是,在一些系统安全策略下,finger命令的功能可能会受到限制,因为它可能会泄露用户的一些隐私信息。
命令示例:
finger root
yum install -y finger
finger root
输出结果:
[root@MineGi ~]# finger root
-bash: finger: 未找到命令
[root@MineGi ~]# yum install -y -q finger
[root@MineGi ~]# finger root
Login: root Name: root
Directory: /root Shell: /bin/bash
On since 六 1月 4 08:32 (CST) on pts/0 from 10.4.7.253
2 seconds idle
On since 六 1月 4 08:45 (CST) on pts/1 from 10.4.7.253
12 minutes 42 seconds idle
No mail.
No Plan.
[root@MineGi ~]#
4、w命令
功能概述
- w命令用于显示当前登录系统的用户及其正在执行的任务等信息。它可以提供比who命令更详细的内容,包括用户登录的时间、终端、从何处登录以及正在运行的命令等。
语法格式
- 基本语法为w [选项] [用户名]。如果不提供选项和用户名,它会显示所有当前登录用户的信息。
常用选项及含义
- -h:不显示标题行。标题行通常包括一些列的标题,如 “USER”“TTY”“FROM”“LOGIN@”“IDLE”“JCPU”“PCPU”“WHAT” 等,使用-h选项可以隐藏这些标题,使输出更加简洁。
- -s:以短格式显示信息。它会简化输出内容,主要显示用户、终端、登录时间和空闲时间等基本信息。
示例说明
- 当在终端输入w命令时,可能会看到类似如下的输出:
10:30:00 up 2:15, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
user1 pts/1 192.168.1.100 08:15 0.00s 0.07s 0.00s w
user2 pts/2 192.168.1.101 09:00 2.00s 0.10s 0.00s vim /etc/passwd
- 从这个输出中可以看到,有两个用户user1和user2登录到系统,user1是通过 IP 地址192.168.1.100在08:15登录的,当前正在运行w命令,空闲时间为0.00s;user2是通过192.168.1.101在09:00登录的,正在编辑/etc/passwd文件,空闲时间为2.00s。load average是系统负载平均值,用于衡量系统的繁忙程度。
命令示例:
w
输出结果:
[root@MineGi ~]# w
10:25:31 up 1:59, 2 users, load average: 0.02, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.4.7.253 08:32 3.00s 0.29s 0.00s w
root pts/1 10.4.7.253 08:45 13:15 0.04s 0.04s -bash
[root@MineGi ~]#
5、who命令
功能介绍
- who命令主要用于查看当前登录系统的用户信息。它能够快速地提供登录用户的用户名、终端设备、登录时间和登录来源等基本信息。
语法格式
- 基本语法为who [选项] [文件]。通常情况下,如果不使用选项,直接运行who命令就会显示当前登录用户的信息。其中 “文件” 参数可以指定从其他文件(如系统的登录记录文件)中获取信息,但一般很少使用。
常用选项及含义
- -a或--all:显示所有信息,包括用户的登录时间、终端、空闲时间、进程 ID、退出时间等更多细节。例如,who -a会输出详细的用户登录相关信息。
- -b或--boot:显示系统上次启动的时间。这对于了解系统运行时长等信息很有用。
- -m或--message:只显示和当前终端相关的用户信息。如果只想快速查看自己(从当前终端登录的用户)的信息,这个选项很方便。
- -q或--count:只显示登录用户的数量和用户名。例如,who -q会输出类似 “3 users logged in: user1 user2 user3” 的内容,用于快速统计登录用户数。
选项 说明
-a 列出所有信息,相当于所有选项。
-b 列出系统最近启动的时间日期。
-l 列出所有可登陆的终端信息。
-m 仅列出关于当前终端的信息,who -m 命令等同于 who am i。
-q 列出在本地系统上的用户和用户数的清单。
-r 显示当前系统的运行级别。
-s 仅显示名称、线路和时间字段信息,这是 who 命令的默认选项。
-u 显示当前每个用户的用户名、登陆终端、登陆时间、线路活动和进程标识。
-T 或 -w 显示 tty 终端的状态,“+”表示对任何人可写,“-”表示仅对 root 用户或所有者可写,“?”表示遇到线路故障。
示例说明
- 例如,在终端中输入who命令,可能会得到如下输出:
user1 pts/1 2025-01-03 09:00 (192.168.1.100)
user2 pts/2 2025-01-03 09:30 (192.168.1.101)
- 这表明用户user1在 2025 年 1 月 3 日 9 点通过 IP 地址为 192.168.1.100 的设备,在终端pts/1登录;用户user2在同一天 9 点 30 分通过 IP 地址 192.168.1.101 的设备,在终端pts/2登录。这些信息对于系统管理员监控系统使用情况以及安全检查等方面非常有用。
命令示例:
who
who -a
who am i
who is nb
输出结果:
[root@MineGi ~]# who
root pts/0 2025-01-04 08:32 (10.4.7.253)
root pts/1 2025-01-04 08:45 (10.4.7.253)
[root@MineGi ~]# who -a
系统引导 2025-01-04 08:26
运行级别 3 2025-01-04 08:26
登录 tty1 2025-01-04 08:26 667 id=tty1
root + pts/0 2025-01-04 08:32 . 1192 (10.4.7.253)
root + pts/1 2025-01-04 08:45 00:13 1281 (10.4.7.253)
[root@MineGi ~]# who am i
root pts/0 2025-01-04 08:32 (10.4.7.253)
[root@MineGi ~]# who is nb
root pts/0 2025-01-04 08:32 (10.4.7.253)
[root@MineGi ~]#
6、whoami命令
功能
- whoami命令用于显示当前用户的用户名。它是一个简单直接的工具,在需要快速确定当前正在使用系统的用户身份时非常有用。
语法和示例
- 语法非常简单,只需在终端中输入whoami,然后按下回车键即可。
- 例如,假设当前用户是alice,在终端输入whoami后,会输出alice。这个命令通常在脚本编写或者需要确认当前用户身份以进行权限相关操作等场景中频繁使用。
命令示例:
whoami
who am i
输出结果:
[root@MineGi ~]# whoami
root
[root@MineGi ~]# who am i
root pts/0 2025-01-04 08:32 (10.4.7.253)
[root@MineGi ~]#
四、权限及归属管理
1、基本访问权限
- 读权限r:
- 针对目录可以查看目录的列表(ls)
- 针对文件可以查看文件内容(cat more less head tail)
- 写权限w:
- 针对目录可以改动目录的列表内容(rm touch mkdir cp mv)
- 针对文件可以修改文件内容(vim sed)
- 可执行x:
- 针对目录可以切换(cd)
- 针对文件允许运行程序(二进制文件,脚本文件)
权限字符表示 | 权限数字表示 | 说明 | |
目录 | r | 4 | 可查看目录下有哪些文件 |
w | 2 | 可修改目录下的文件 | |
x | 1 | 可执行(作为目录最小的权限) | |
文件 | r | 4 | 可读取文件内容 |
w | 2 | 可修改文件内容 | |
x | 1 | 可运行文件 |
拓展:
- 若一个文件可以被删除,那与它本身权限有关吗?
答:当前用户如果有该文件所在目录的wr权限,就可以实现删除操作
- 将/opt/test复制到/mnt,当前用户一定要有什么权限?
答:当前用户一定要有r权限
注:能不能操作目录和文件,和当前登录用户的权限有关系
2、归属(所有权)
- 属主:拥有该文件的用户账号
- 属组:拥有该文件的组账号
访问人群(设置权限的对象)
对象 | 对象字符表示 |
所属主 | u |
所属组 | g |
其他用户 | o |
所有用户 | a |
3、查看文件的权限和归属
命令示例:
ls -ld /root/ /etc/passwd /run/systemd/inhibit/1.ref /dev/{fd,log,snapshot,sr0}
输出结果:
[root@MineGi ~]# ls -ld /root/ /etc/passwd /run/systemd/inhibit/1.ref /dev/{fd,log,snapshot,sr0}
lrwxrwxrwx 1 root root 13 1月 4 08:26 /dev/fd -> /proc/self/fd
srw-rw-rw- 1 root root 0 1月 4 08:26 /dev/log
crw------- 1 root root 10, 231 1月 4 08:26 /dev/snapshot
brw-rw---- 1 root cdrom 11, 0 1月 4 08:26 /dev/sr0
-rw-r--r-- 1 root root 965 1月 4 09:23 /etc/passwd
dr-xr-x---. 2 root root 141 1月 4 08:57 /root/
prw------- 1 root root 0 1月 4 08:26 /run/systemd/inhibit/1.ref
[root@MineGi ~]#
第一位表示文件类型
- -:表示一般文件
- d:表示目录
- l:表示软链接(快捷方式)
- p:表示PIPE管道文件
- s:表示socket通信套接字文件
- c:表示字符设备文件
- b:表示块设备文件
各权限的字母及8进制表示
权限 | 字母表示 | 8进制 |
读权限 | r | 4 |
写权限 | w | 2 |
可执行 | x | 1 |
无权限 | - | 0 |
- drwxr-xr-x 的意思是一个权限为755的目录
- -rw-r--r-- 的意思是一个权限为644的文件
- 目录满权限:777,默认是755
- 文件满权限:666,默认是644
4、修改目录或文件的权限和归属
4.1 chmod命令
基本功能
- chmod命令用于改变文件或目录的访问权限。在 Linux 系统中,每个文件和目录都有一组权限,用于控制用户(所有者)、用户组和其他用户对其访问的方式,包括读(r)、写(w)和执行(x)权限。
语法格式
- 符号模式:chmod [ugoa][+-=][rwx] 文件或目录
- 其中,u代表所有者(user),g代表用户组(group),o代表其他用户(others),a代表所有用户(all,即 ugo 的总和)。+表示增加权限,-表示减少权限,=表示赋予指定权限。r、w、x分别代表读、写、执行权限。
- 数字模式:chmod [数字] 文件或目录
- 数字是权限的八进制表示,其中每个数字代表一组用户权限。从左到右,第一个数字代表所有者权限,第二个数字代表用户组权限,第三个数字代表其他用户权限。每个数字通过把相应的权限位相加得到:r为 4,w为 2,x为 1。例如,7表示rwx(4 + 2+ 1),6表示rw(4 + 2),5表示rx(4 + 1)。
常用选项:
- -R:表示以递归的方式设置目录及目录下的所有子目录及文件的权限。
- u:属主
- g:属组
- o:其他人
- a:所有人
- +:添加
- -:删除
- =:重置
示例说明
- 符号模式示例:
- 给文件test.txt的所有者增加执行权限:chmod u+x test.txt
- 给文件example.txt的用户组减少写权限:chmod g -w example.txt
- 赋予文件document.txt所有用户读和写权限:chmod a=rw document.txt
- 数字模式示例:
- 赋予文件new_file.txt所有者读、写、执行权限,用户组读和执行权限,其他用户读权限,可以使用chmod 754 new_file.txt。计算方式是所有者权限为rwx(7 = 4 + 2 + 1),用户组权限为rx(5 = 4 + 1),其他用户权限为r(4)。
命令示例:
mkdir -m 006 testdir1
ls -ld testdir1
chmod a+x testdir1
ll -ld testdir1/
chmod u=rw,g+r,o-w testdir1/
ll -ld testdir1/
chmod 777 testdir1/
ls -ld testdir1/
chmod 755 testdir1/
ls -ld testdir1/
touch testdir1/{1..3}.txt
ll testdir1/
chmod 777 testdir1/
ll testdir1/
chmod -R 777 testdir1/
ll testdir1/
输出结果:
[root@MineGi ~]# mkdir -m 006 testdir1
[root@MineGi ~]# ls -ld testdir1
d------rw- 2 root root 6 1月 4 10:29 testdir1
[root@MineGi ~]# chmod a+x testdir1
[root@MineGi ~]# ll -ld testdir1/
d--x--xrwx 2 root root 6 1月 4 10:29 testdir1/
[root@MineGi ~]# chmod u=rw,g+r,o-w testdir1/
[root@MineGi ~]# ll -ld testdir1/
drw-r-xr-x 2 root root 6 1月 4 10:29 testdir1/
[root@MineGi ~]# chmod 777 testdir1/
[root@MineGi ~]# ls -ld testdir1/
drwxrwxrwx 2 root root 6 1月 4 10:29 testdir1/
[root@MineGi ~]# chmod 755 testdir1/
[root@MineGi ~]# ls -ld testdir1/
drwxr-xr-x 2 root root 6 1月 4 10:29 testdir1/
[root@MineGi ~]# touch testdir1/{1..3}.txt
[root@MineGi ~]# ll testdir1/
总用量 0
-rw-r--r-- 1 root root 0 1月 4 10:32 1.txt
-rw-r--r-- 1 root root 0 1月 4 10:32 2.txt
-rw-r--r-- 1 root root 0 1月 4 10:32 3.txt
[root@MineGi ~]# chmod 777 testdir1/
[root@MineGi ~]# ll testdir1/
总用量 0
-rw-r--r-- 1 root root 0 1月 4 10:32 1.txt
-rw-r--r-- 1 root root 0 1月 4 10:32 2.txt
-rw-r--r-- 1 root root 0 1月 4 10:32 3.txt
[root@MineGi ~]# chmod -R 777 testdir1/
[root@MineGi ~]# ll testdir1/
总用量 0
-rwxrwxrwx 1 root root 0 1月 4 10:32 1.txt
-rwxrwxrwx 1 root root 0 1月 4 10:32 2.txt
-rwxrwxrwx 1 root root 0 1月 4 10:32 3.txt
[root@MineGi ~]#
4.2 chown命令
基本功能
- chown命令用于更改文件或目录的所有者和所属用户组。这在用户权限管理和文件资源分配等场景中非常有用。
语法格式
- 基本语法为chown [选项] [所有者][:[用户组]] 文件或目录。
- 其中,“选项” 可以用来指定一些特殊的操作方式;“所有者” 是要设置的文件或目录的新所有者;“用户组” 是要设置的文件或目录的新所属用户组,若省略 “: 用户组” 部分,则仅更改所有者,所属用户组不变。
chown 用户名:组名 文件名 #目录/文件的属主、属组都修改
chown 用户名 文件名 #只修改目录/文件的属主
chown :组名 文件名 #只修改目录/文件的属组
常用选项及含义
- -R:用于递归地更改目录及其子目录和文件的所有者和所属用户组。这在处理包含大量文件和子目录的目录结构时非常方便。例如,chown -R user1:group1 /home/directory会将/home/directory目录及其内部的所有文件和子目录的所有者设为user1,所属用户组设为group1。
示例说明
- 简单地将文件test.txt的所有者更改为user1,可以使用命令chown user1 test.txt。
- 若要将目录/data及其内部所有文件和子目录的所有者改为user2,所属用户组改为group2,可以使用chown -R user2:group2 /data。这样的操作可以根据系统管理的需求,灵活地调整文件和目录的归属,从而合理地分配系统资源的访问权限。
命令示例:
ls -ld testdir1/
tail -2 /etc/passwd
id user5
id new_user1
chown new_user1 testdir1/
ls -ld testdir1/
chown user5 testdir1/
ls -ld testdir1/
chown new_user1:user5 testdir1/
ls -ld testdir1/
chown :root testdir1/
ls -ld testdir1/
chown user5: testdir1/
ls -ld testdir1/
chgrp root testdir1/
ls -ld testdir1/
ll testdir1/1.txt
chown -R user5. testdir1/
ll testdir1/1.txt
输出结果:
[root@MineGi ~]# ls -ld testdir1/
drwxrwxrwx 2 root root 45 1月 4 10:32 testdir1/
[root@MineGi ~]# tail -2 /etc/passwd
user5:x:5002:5002::/home/user5:/bin/bash
new_user1:x:1000:1000::/home/user1:/bin/bash
[root@MineGi ~]# id user5
uid=5002(user5) gid=5002(user5) 组=5002(user5)
[root@MineGi ~]# id new_user1
uid=1000(new_user1) gid=1000(user1) 组=1000(user1)
[root@MineGi ~]# chown new_user1 testdir1/
[root@MineGi ~]# ls -ld testdir1/
drwxrwxrwx 2 new_user1 root 45 1月 4 10:32 testdir1/
[root@MineGi ~]# chown user5 testdir1/
[root@MineGi ~]# ls -ld testdir1/
drwxrwxrwx 2 user5 root 45 1月 4 10:32 testdir1/
[root@MineGi ~]# chown new_user1:user5 testdir1/
[root@MineGi ~]# ls -ld testdir1/
drwxrwxrwx 2 new_user1 user5 45 1月 4 10:32 testdir1/
[root@MineGi ~]# chown :root testdir1/
[root@MineGi ~]# ls -ld testdir1/
drwxrwxrwx 2 new_user1 root 45 1月 4 10:32 testdir1/
[root@MineGi ~]# chown user5: testdir1/
[root@MineGi ~]# ls -ld testdir1/
drwxrwxrwx 2 user5 user5 45 1月 4 10:32 testdir1/
[root@MineGi ~]# chgrp root testdir1/
[root@MineGi ~]# ls -ld testdir1/
drwxrwxrwx 2 user5 root 45 1月 4 10:32 testdir1/
[root@MineGi ~]# ll testdir1/1.txt
-rwxrwxrwx 1 root root 0 1月 4 10:32 testdir1/1.txt
[root@MineGi ~]# chown -R user5. testdir1/
[root@MineGi ~]# ll testdir1/1.txt
-rwxrwxrwx 1 user5 user5 0 1月 4 10:32 testdir1/1.txt
[root@MineGi ~]#
4.3 umask命令
umask值 | 目录权限值 | 文件权限值 |
0 | 7 | 6 |
1 | 6 | 6 |
2 | 5 | 4 |
3 | 4 | 4 |
4 | 3 | 2 |
5 | 2 | 2 |
6 | 1 | 0 |
7 | 0 | 0 |
umask的值可以用来保留在创建新文件时的初始权限
- 新建文件的默认权限: 666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶数不变
- 新建目录的默认权限: 777-umask
- root的umask 默认是0022,即目录权限为755,文件权限为644
- 非特权用户umask默认是0002
例如:
- umask值为0000,则目录权限值777,文件权限值666
- umask值为0022,则目录权限值755,文件权限值644
基本功能
- umask命令用于设置文件和目录创建时默认的权限掩码。它决定了在创建新文件或目录时,要从最大权限(文件是666,目录是777)中减去的权限值。
语法格式
- 基本语法为umask [模式]。其中 “模式” 是要设置的权限掩码,通常以三位八进制数字表示。如果不提供模式,umask命令会显示当前的权限掩码设置。
权限掩码的计算和作用原理
- 对于文件:
- 最大权限默认是666(即rw -rw -rw -)。当创建一个新文件时,系统会用666减去umask的值来确定文件的初始权限。例如,如果umask设置为022,那么新文件的权限计算为666 - 022 = 644(即rw-r--r--)。
- 对于目录:
- 最大权限默认是777(即rwxrwxrwx)。当创建一个新目录时,系统会用777减去umask的值来确定目录的初始权限。例如,如果umask设置为027,那么新目录的权限计算为777 - 027 = 750(即rwxr-x---)。
示例说明
- 显示当前的umask设置:umask(直接输入命令,不带参数),系统可能会输出0022。
- 设置新的umask值:umask 0027。这样设置后,新创建的文件权限将是640(666 - 026),新创建的目录权限将是750(777 - 027)。通过调整umask的值,系统管理员可以控制用户创建文件和目录时的默认权限,从而增强系统的安全性和权限管理的灵活性。
命令示例:
umask
mkdir testdir2
touch file1.txt
ls -ld testdir2
ls -l file1.txt
umask 777
umask
mkdir testdir3
touch file2.txt
ls -ld testdir3
ls -l file2.txt
umask 022
umask
输出结果:
[root@MineGi ~]# umask
0022
[root@MineGi ~]# mkdir testdir2
[root@MineGi ~]# touch file1.txt
[root@MineGi ~]# ls -ld testdir2
drwxr-xr-x 2 root root 6 1月 4 10:43 testdir2
[root@MineGi ~]# ls -l file1.txt
-rw-r--r-- 1 root root 0 1月 4 10:43 file1.txt
[root@MineGi ~]# umask 777
[root@MineGi ~]# umask
0777
[root@MineGi ~]# mkdir testdir3
[root@MineGi ~]# touch file2.txt
[root@MineGi ~]# ls -ld testdir3
d--------- 2 root root 6 1月 4 10:43 testdir3
[root@MineGi ~]# ls -l file2.txt
---------- 1 root root 0 1月 4 10:43 file2.txt
[root@MineGi ~]# umask 022
[root@MineGi ~]# umask
0022
[root@MineGi ~]#
5、特殊访问权限
5.1 sticky
“sticky” 在文件系统权限中的含义(主要是针对目录)
- 在 Linux 文件系统权限中,“sticky”(粘滞位)是一种特殊的权限设置。当一个目录被设置了粘滞位后,只有文件的所有者、目录的所有者或者超级用户(root)才能删除或重命名该目录中的文件。
- 这种权限主要用于像 “/tmp” 这样的共享目录。在 “/tmp” 目录中,多个用户可能会创建文件,设置粘滞位可以防止一个用户随意删除其他用户在该目录下创建的文件。
设置粘滞位的语法(以 chmod 命令为例)
- 符号模式:chmod +t 目录名,这里的 “+t” 表示添加粘滞位。例如,chmod +t /shared_folder会给 “/shared_folder” 目录添加粘滞位。
- 数字模式:在数字模式下,粘滞位对应的数字是 “1”。对于目录权限,其完整的八进制表示是四位数字,第一位数字代表特殊权限(如粘滞位)。例如,要将一个目录设置为所有者有读、写、执行权限,用户组有读和执行权限,其他用户有读和执行权限,并且设置粘滞位,那么可以使用chmod 1755 目录名。这里的 “1” 就是粘滞位,后面的 “755” 分别对应所有者、用户组和其他用户的常规权限(rwxr-xr-x)。
查看粘滞位是否设置
- 可以使用ls -ld 目录名命令来查看目录的详细权限信息。如果目录设置了粘滞位,在权限位的最后会看到一个 “t”(对于其他用户权限部分)。例如,ls -ld /tmp可能会输出 “drwxrwxrwt”,这里的 “t” 表示 “/tmp” 目录设置了粘滞位。
命令示例:
ls -ld /tmp
mkdir data
ls -ld data
chmod o+t data
ls -ld data
chmod o-t data
ls -ld data
输出结果:
[root@MineGi ~]# ls -ld /tmp
drwxrwxrwt. 10 root root 240 1月 4 10:36 /tmp
[root@MineGi ~]# mkdir data
[root@MineGi ~]# ls -ld data
drwxr-xr-x 2 root root 6 1月 4 10:44 data
[root@MineGi ~]# chmod o+t data
[root@MineGi ~]# ls -ld data
drwxr-xr-t 2 root root 6 1月 4 10:44 data
[root@MineGi ~]# chmod o-t data
[root@MineGi ~]# ls -ld data
drwxr-xr-x 2 root root 6 1月 4 10:44 data
[root@MineGi ~]#
5.2 suid
SUID(Set - User - ID)基本概念
- SUID 是一种特殊的文件权限设置。当一个可执行文件设置了 SUID 位时,任何用户在执行这个文件时,都将以该文件所有者的身份来运行,而不是以实际执行用户的身份。这主要用于一些需要特殊权限才能完成任务的程序。
- 例如,passwd命令用于修改用户密码。普通用户没有权限直接修改/etc/passwd和/etc/shadow文件(这两个文件存储用户账户信息和密码信息),但passwd命令被设置了 SUID 位,当普通用户执行passwd命令时,会以root(passwd命令所有者通常是root)的身份来运行,从而能够修改密码相关文件。
设置 SUID 的语法(以 chmod 命令为例)
- 符号模式:chmod u+s 文件名,其中 “u+s” 表示给文件所有者(user)添加 SUID 位。例如,chmod u+s my_program会给 “my_program” 文件设置 SUID 位。
- 数字模式:在数字模式下,SUID 对应的数字是 “4”。如果要设置一个文件的权限为所有者有读、写、执行权限,用户组有读和执行权限,其他用户有读权限,并且设置 SUID 位,那么可以使用chmod 4754 文件名。这里的 “4” 就是 SUID 位,后面的 “754” 分别对应所有者、用户组和其他用户的常规权限(rwxr-xr -)。
查看 SUID 是否设置
- 可以使用ls -l 文件名命令来查看文件的详细权限信息。如果文件设置了 SUID 位,在所有者权限部分的执行权限位(x)的位置会看到一个 “s”。例如,ls -l /usr/bin/passwd可能会输出 “-rwsr-xr-x”,这里的 “s” 表示/usr/bin/passwd文件设置了 SUID 位。不过需要注意的是,如果所有者权限本身没有执行权限(x),那么设置 SUID 位后会看到一个 “S”,这是一种特殊情况。
命令示例:
ls -l /usr/bin/passwd
touch file1.txt
ls -l file1.txt
chmod u+s file1.txt
ls -l file1.txt
chmod u-s file1.txt
ls -l file1.txt
输出结果:
[root@MineGi ~]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd
[root@MineGi ~]# touch file1.txt
[root@MineGi ~]# ls -l file1.txt
-rw-r--r-- 1 root root 0 1月 4 10:46 file1.txt
[root@MineGi ~]# chmod u+s file1.txt
[root@MineGi ~]# ls -l file1.txt
-rwSr--r-- 1 root root 0 1月 4 10:46 file1.txt
[root@MineGi ~]# chmod u-s file1.txt
[root@MineGi ~]# ls -l file1.txt
-rw-r--r-- 1 root root 0 1月 4 10:46 file1.txt
[root@MineGi ~]#
5.3 guid
基本概念
- GUID(Group - Identifier,组标识符)在权限设置中有特殊的用途。它主要涉及到 Set - Group - ID(SGID)权限。与 SUID 类似,SGID 是一种特殊权限。当一个文件设置了 SGID 位后,任何用户执行这个文件时,会以该文件所属用户组的身份来运行。对于目录而言,SGID 有着更重要的作用。当一个目录设置了 SGID 位,在这个目录下创建的新文件所属的用户组将是该目录的用户组,而不是创建文件的用户所属的用户组。
设置 SGID 的语法(以 chmod 命令为例)
- 符号模式:chmod g+s 文件或目录名,这里的 “g+s” 表示给用户组(group)添加 SGID 位。例如,chmod g+s shared_folder会给 “shared_folder” 目录添加 SGID 位。
- 数字模式:在数字模式下,SGID 对应的数字是 “2”。如果要设置一个目录的权限为所有者有读、写、执行权限,用户组有读和执行权限,其他用户有读和执行权限,并且设置 SGID 位,那么可以使用chmod 2755 目录名。这里的 “2” 就是 SGID 位,后面的 “755” 分别对应所有者、用户组和其他用户的常规权限(rwxr -xr -x)。
查看 SGID 是否设置
- 可以使用ls -l 文件或目录名命令来查看详细权限信息。如果文件设置了 SGID 位,在用户组权限部分的执行权限位(x)的位置会看到一个 “s”。对于目录,如果设置了 SGID 位,权限部分可能会显示类似 “drwxrwsr -x” 的形式,其中的 “s” 表示设置了 SGID 位。如果用户组权限本身没有执行权限(x),设置 SGID 位后会看到一个 “S”,这也是一种特殊情况。
命令示例:
touch file1.txt
ls -l file1.txt
chmod g+s file1.txt
ls -l file1.txt
chmod g-s file1.txt
ls -l file1.txt
输出结果:
[root@MineGi ~]# touch file1.txt
[root@MineGi ~]# ls -l file1.txt
-rw-r--r-- 1 root root 0 1月 4 10:47 file1.txt
[root@MineGi ~]# chmod g+s file1.txt
[root@MineGi ~]# ls -l file1.txt
-rw-r-Sr-- 1 root root 0 1月 4 10:47 file1.txt
[root@MineGi ~]# chmod g-s file1.txt
[root@MineGi ~]# ls -l file1.txt
-rw-r--r-- 1 root root 0 1月 4 10:47 file1.txt
[root@MineGi ~]#
命令示例:
ls
rm -rf *
ls
输出结果:
[root@MineGi ~]# ls
1.txt data file1.txt file2.txt testdir1 testdir2 testdir3
[root@MineGi ~]# rm -rf *
[root@MineGi ~]# ls
[root@MineGi ~]#