linux用户用户组相关
如何查看所有用户的 authorized_keys
查看所有用户的 authorized_keys 文件,需要切换到 root 用户(或使用 sudo),然后遍历每个用户的家目录。以下是几种常用的方法。
方法一:逐个用户查看
先列出所有用户,然后手动进入每个用户的家目录查看。
# 查看所有用户名
cut -d: -f1 /etc/passwd
# 逐个查看,例如查看 root 和 aabbccc 用户
sudo cat /root/.ssh/authorized_keys
sudo cat /home/aabbccc/.ssh/authorized_keys如果用户的家目录不在/home/下(如 root 在/root),或.ssh/目录不存在,cat命令会报错,这表示该用户未配置 SSH 密钥。
方法二:使用 find 命令全局搜索(推荐)
自动搜索系统中所有可能存在的 authorized_keys 文件,并显示其内容。
sudo find / -name "authorized_keys" 2>/dev/null | xargs -I {} sh -c 'echo "===== {} =====" && cat {}'解释:
sudo find / -name "authorized_keys" 2>/dev/null:从根目录搜索名为authorized_keys的文件,错误信息重定向到/dev/nullxargs -I {}:将找到的每个文件路径传递给后续命令sh -c 'echo "===== {} =====" && cat {}':先打印文件路径作为分隔符,再显示文件内容
方法三:遍历 /etc/passwd 中的所有用户(最彻底)
读取 /etc/passwd 中所有用户的家目录,并尝试显示其中的 authorized_keys。
sudo awk -F: '{ print $1 " " $6 }' /etc/passwd | while read user home; do
if [ -f "$home/.ssh/authorized_keys" ]; then
echo "===== 用户: $user ($home) ====="
cat "$home/.ssh/authorized_keys"
echo
fi
done解释:
awk -F: '{ print $1 " " $6 }' /etc/passwd:提取用户名($1)和家目录路径($6)while read user home:循环读取每一行if [ -f "$home/.ssh/authorized_keys" ]:检查文件是否存在且为普通文件- 如果存在,则打印用户信息和文件内容
方法四:查看当前用户的 authorized_keys
如果只查看当前登录用户的密钥文件:
cat ~/.ssh/authorized_keys可能遇到的问题
- 权限不足:需使用
sudo或以root身份执行命令 - 文件不存在:表示该用户未配置 SSH 密钥登录
- 内容为空:文件存在但未添加任何公钥
快速对照表
| 需求 | 推荐命令 |
|---|---|
| 查看特定用户的密钥 | sudo cat /home/用户名/.ssh/authorized_keys |
| 全局找出所有密钥文件 | sudo find / -name "authorized_keys" 2>/dev/null |
| 获得完整清晰的报告 | 使用方法三的脚本 |
如何查看所有用户组
在 Linux 系统中,查看所有用户组有多种方法,具体取决于你想看的是系统上定义的所有组,还是某个用户属于哪些组。
查看系统上所有的用户组
最直接的方法是查看 /etc/group 文件,它记录了系统中所有的组信息。
# 查看所有组
cat /etc/group这个文件的每一行代表一个组,格式为 组名:密码占位符:GID:组成员列表。例如:
root:x:0:
sudo:x:27:lighthouse,aabbccc
lighthouse:x:1000:如果只想看组名列表,可以用 cut 命令提取第一列:
cut -d: -f1 /etc/group如果想只查看普通用户组(GID >= 1000),可以过滤:
awk -F: '$3 >= 1000 {print $1}' /etc/group查看特定用户属于哪些组
查看当前登录用户属于哪些组:
groups查看指定用户(例如 aabbccc)属于哪些组:
groups aabbccc或者使用 id 命令获取更详细的信息(包括 UID、GID 和所有所属组):
id aabbcccUID/GID 如何影响权限?
Linux 的文件权限系统直接依赖于 UID 和 GID。每个文件或目录都记录了三个关键信息:
- 所有者 UID:该文件属于哪个用户
- 所属组 GID:该文件属于哪个组
- 权限位:针对“所有者”、“所属组”、“其他人”分别设置的读/写/执行权限
当用户访问一个文件时,系统会做如下检查:
- 如果用户的 UID 等于文件的所有者 UID,则应用“所有者”权限
- 否则,如果用户所属的任何一个 GID 等于文件的所属组 GID,则应用“所属组”权限
- 否则,应用“其他人”权限
实际意义
- 你在
/etc/passwd中看到aabbccc:x:1001:1001:...,其中第一个1001是 UID,第二个1001是 GID,表示该用户的 UID 为 1001,默认所属组 GID 为 1001 - 系统用户如
www-data:x:33:33:...,其 UID 和 GID 均为 33,属于系统用户范围,不具备登录权限 - 当你执行
sudo chown aabbccc:www-data file.txt时,就是在修改文件的所有者 UID 为 1001、所属组 GID 为 33
快速对照表
| 查看内容 | 命令 |
|---|---|
| 当前用户的 UID/GID | id |
| 只显示 UID | id -u |
| 只显示 GID | id -g |
| 指定用户的 UID/GID | id 用户名 |
| 所有用户的 UID/GID | awk -F: '{print $1, $3, $4}' /etc/passwd |
| 所有组的 GID | awk -F: '{print $1, $3}' /etc/group |
快速对照表
| 需求 | 命令 |
|---|---|
| 查看所有组 | cat /etc/group |
| 只显示组名 | cut -d: -f1 /etc/group |
| 只显示普通用户组(GID>=1000) | awk -F: '$3 >= 1000 {print $1}' /etc/group |
| 查看当前用户的组 | groups |
| 查看指定用户的组 | groups 用户名 |
| 查看用户详细信息(含组) | id 用户名 |
补充说明
在云服务器的默认配置中,有几个常见组值得注意:
sudo组:成员可以通过sudo提权,是否需要密码取决于/etc/sudoers中的配置google-sudoers组:Google Cloud 默认使用的提权组,通常配置为NOPASSWD- 用户名同名的组:创建用户时系统通常会创建一个同名的私有组
将用户加入 sudo 组的命令:
sudo usermod -aG sudo 用户名将上述内容整合为完整笔记
一、用户管理核心文件
| 文件 | 作用 |
|---|---|
/etc/passwd | 存储用户账户信息(用户名、UID、家目录、Shell等) |
/etc/group | 存储用户组信息(组名、GID、组成员) |
/etc/shadow | 存储用户密码的加密哈希值 |
~/.ssh/authorized_keys | 存储允许该用户通过SSH登录的公钥列表 |
/etc/sudoers | 控制sudo权限的配置文件,需用visudo编辑 |
二、用户与组的查看命令汇总
| 操作 | 命令 |
|---|---|
| 查看所有用户 | cat /etc/passwd |
| 只显示用户名 | cut -d: -f1 /etc/passwd |
| 只显示普通用户(UID>=1000) | awk -F: '$3 >= 1000 {print $1}' /etc/passwd |
| 查看当前登录用户名 | whoami |
| 查看所有在线用户 | who 或 w |
| 查看所有组 | cat /etc/group |
| 只显示组名 | cut -d: -f1 /etc/group |
| 查看当前用户的组 | groups |
| 查看指定用户的组 | groups 用户名 |
| 查看用户详细信息 | id 用户名 |
| 查看当前用户的 authorized_keys | cat ~/.ssh/authorized_keys |
| 查看指定用户的 authorized_keys | sudo cat /home/用户名/.ssh/authorized_keys |
| 全局搜索所有 authorized_keys | sudo find / -name "authorized_keys" 2>/dev/null |
三、用户管理常用操作
# 创建新用户
sudo adduser 用户名
# 将用户加入sudo组
sudo usermod -aG sudo 用户名
# 切换用户
su - 用户名
# 配置SSH密钥登录(以新用户身份执行)
mkdir ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys四、sudo权限配置要点
- 必须使用
visudo命令编辑/etc/sudoers,不能直接用vi visudo保存时会自动检查语法错误,防止sudo功能失效- 推荐使用
visudo -f /etc/sudoers.d/文件名创建独立配置文件 - 可用
visudo -c检查当前配置语法是否正确
五、安全最佳实践
- 禁止root直接SSH登录(PermitRootLogin no 或 prohibit-password)
- 创建普通用户用于日常操作
- 配置SSH密钥登录,关闭密码认证(PasswordAuthentication no)
- 为普通用户配置sudo权限
- 保留云厂商VNC控制台作为紧急救援通道
修改SSH配置前务必确认密钥登录可用,保持至少一个已连接会话用于测试
Linux 用户家目录与 SSH 登录权限笔记
一、用户家目录位置
1.1 标准路径规则
/root/:root 用户的家目录,位于根目录下/home/用户名/:普通用户的家目录,例如用户aabbccc的家目录为/home/aabbccc/
1.2 查看用户家目录的方法
| 需求 | 命令 |
|---|---|
| 查看所有用户的用户名和家目录 | awk -F: '{ print "用户名: " $1 " -> 家目录: " $6 }' /etc/passwd |
| 查看指定用户的家目录 | echo ~用户名 |
| 查看当前用户的家目录 | echo $HOME |
| 切换到用户并查看家目录 | su - 用户名 然后 pwd |
1.3 特殊说明
- 某些系统用户(如
nobody、www-data)的家目录可能设置为/nonexistent或/var/www等非标准路径,表示该用户不需要登录或没有普通 Shell - 在创建用户时,可以手动指定家目录路径:
adduser --home /custom/path 用户名 - 除
/root外,根目录下通常不会直接放置其他用户的家目录,这是 Linux 文件系统层次结构(FHS)的标准约定
二、系统用户与普通用户的区别
2.1 三种用户类型对比
| 类型 | UID 范围 | 服务对象 | 登录 Shell | SSH 登录权限 |
|---|---|---|---|---|
| root 用户 | 0 | 操作系统超级管理员 | /bin/bash 或 /bin/sh | 通常被云厂商默认禁止(PermitRootLogin no) |
| 手动创建的普通用户 | 1000 及以上 | 真人管理员日常操作 | /bin/bash 或 /bin/sh | 有(需配置密钥) |
| 系统用户(伪用户) | 1-999 | 运行特定软件或系统服务 | /usr/sbin/nologin 或 /bin/false | 无,从底层禁止 |
2.2 常见系统用户及其作用
| 用户 | 作用 |
|---|---|
www-data | Web 服务器用户(Nginx/Apache 运行身份) |
sshd | 管理 SSH 服务本身的用户 |
nobody | 权限最低的用户,用于运行不信任的隔离进程 |
systemd-network | systemd 的网络管理组件 |
messagebus | 系统进程间通信(D-Bus)服务 |
polkitd | 管理系统范围内的权限(PolicyKit)服务 |
_apt | Debian/Ubuntu 中 apt 包管理工具的安全操作用户 |
_chrony | 时间同步服务 chrony |
dnsmasq | 轻量级 DNS 和 DHCP 服务 |
2.3 登录权限的两层安全关卡
- 登录 Shell 配置(
/etc/passwd):系统用户的 Shell 为/usr/sbin/nologin,认证通过后直接拒绝进入命令行 - SSH 服务端配置(
/etc/ssh/sshd_config):可通过DenyUsers、AllowUsers、DenyGroups、AllowGroups进行精确控制
三、查看用户与 SSH 登录权限的方法
3.1 查看所有用户
# 查看所有用户信息
cat /etc/passwd
# 只显示用户名
cut -d: -f1 /etc/passwd
# 只显示普通用户(UID >= 1000)
awk -F: '$3 >= 1000 {print $1}' /etc/passwd
# 查看所有用户的用户名和登录 Shell
awk -F: '{ print $1 " -> " $7 }' /etc/passwd3.2 查看哪些用户有 SSH 登录潜力
# 筛选 Shell 不是 nologin/false 的用户
awk -F: '$7 !~ /nologin|false/ {print $1}' /etc/passwd
# 检查这些用户是否配置了 SSH 密钥
awk -F: '$7 !~ /nologin|false/ { print $1 " -> " $6 }' /etc/passwd | while read user home; do
if [ -f "$home/.ssh/authorized_keys" ] && [ -s "$home/.ssh/authorized_keys" ]; then
echo "[可登录] $user (密钥已配置)"
else
echo "[可能可登录] $user (Shell有效,但未找到密钥或密钥为空)"
fi
done3.3 查看 SSH 配置中的用户级限制
# 查看 AllowUsers / DenyUsers / AllowGroups / DenyGroups 配置
sudo grep -E "AllowUsers|DenyUsers|AllowGroups|DenyGroups" /etc/ssh/sshd_config这些配置存在时会覆盖默认的“所有用户均可登录”策略。
3.4 查看当前已登录用户
who
w3.5 查看被禁止登录的用户
# 查看所有 Shell 为 nologin 或 false 的用户
grep -E "nologin|false" /etc/passwd四、关键结论
- 在标准的、安全的 Linux 服务器上,只有 root 和 UID >= 1000 的手动创建用户才具备登录权限
- 系统用户(UID 1-999)的 Shell 均为
/usr/sbin/nologin或/bin/false,从系统底层禁止登录 - 系统用户即使配置了 SSH 密钥,也无法登录,因为认证通过后 Shell 检查会直接拒绝
- 系统用户的设计目的是让每个软件/服务拥有独立的权限,遵循最小权限原则
- 若要将手动创建用户的登录权限移除,只需将其 Shell 改为
/usr/sbin/nologin即可,无需删除用户