如何查看所有用户的 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/null
  • xargs -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

可能遇到的问题

  1. 权限不足:需使用 sudo 或以 root 身份执行命令
  2. 文件不存在:表示该用户未配置 SSH 密钥登录
  3. 内容为空:文件存在但未添加任何公钥

快速对照表

需求推荐命令
查看特定用户的密钥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 aabbccc

UID/GID 如何影响权限?

Linux 的文件权限系统直接依赖于 UID 和 GID。每个文件或目录都记录了三个关键信息:

  1. 所有者 UID:该文件属于哪个用户
  2. 所属组 GID:该文件属于哪个组
  3. 权限位:针对“所有者”、“所属组”、“其他人”分别设置的读/写/执行权限

当用户访问一个文件时,系统会做如下检查:

  1. 如果用户的 UID 等于文件的所有者 UID,则应用“所有者”权限
  2. 否则,如果用户所属的任何一个 GID 等于文件的所属组 GID,则应用“所属组”权限
  3. 否则,应用“其他人”权限

实际意义

  • 你在 /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/GIDid
只显示 UIDid -u
只显示 GIDid -g
指定用户的 UID/GIDid 用户名
所有用户的 UID/GIDawk -F: '{print $1, $3, $4}' /etc/passwd
所有组的 GIDawk -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
查看所有在线用户whow
查看所有组cat /etc/group
只显示组名cut -d: -f1 /etc/group
查看当前用户的组groups
查看指定用户的组groups 用户名
查看用户详细信息id 用户名
查看当前用户的 authorized_keyscat ~/.ssh/authorized_keys
查看指定用户的 authorized_keyssudo cat /home/用户名/.ssh/authorized_keys
全局搜索所有 authorized_keyssudo 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 检查当前配置语法是否正确

五、安全最佳实践

  1. 禁止root直接SSH登录(PermitRootLogin no 或 prohibit-password)
  2. 创建普通用户用于日常操作
  3. 配置SSH密钥登录,关闭密码认证(PasswordAuthentication no)
  4. 为普通用户配置sudo权限
  5. 保留云厂商VNC控制台作为紧急救援通道
  6. 修改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 特殊说明

  • 某些系统用户(如 nobodywww-data)的家目录可能设置为 /nonexistent/var/www 等非标准路径,表示该用户不需要登录或没有普通 Shell
  • 在创建用户时,可以手动指定家目录路径:adduser --home /custom/path 用户名
  • /root 外,根目录下通常不会直接放置其他用户的家目录,这是 Linux 文件系统层次结构(FHS)的标准约定

二、系统用户与普通用户的区别

2.1 三种用户类型对比

类型UID 范围服务对象登录 ShellSSH 登录权限
root 用户0操作系统超级管理员/bin/bash/bin/sh通常被云厂商默认禁止(PermitRootLogin no
手动创建的普通用户1000 及以上真人管理员日常操作/bin/bash/bin/sh有(需配置密钥)
系统用户(伪用户)1-999运行特定软件或系统服务/usr/sbin/nologin/bin/false无,从底层禁止

2.2 常见系统用户及其作用

用户作用
www-dataWeb 服务器用户(Nginx/Apache 运行身份)
sshd管理 SSH 服务本身的用户
nobody权限最低的用户,用于运行不信任的隔离进程
systemd-networksystemd 的网络管理组件
messagebus系统进程间通信(D-Bus)服务
polkitd管理系统范围内的权限(PolicyKit)服务
_aptDebian/Ubuntu 中 apt 包管理工具的安全操作用户
_chrony时间同步服务 chrony
dnsmasq轻量级 DNS 和 DHCP 服务

2.3 登录权限的两层安全关卡

  1. 登录 Shell 配置(/etc/passwd):系统用户的 Shell 为 /usr/sbin/nologin,认证通过后直接拒绝进入命令行
  2. SSH 服务端配置(/etc/ssh/sshd_config):可通过 DenyUsersAllowUsersDenyGroupsAllowGroups 进行精确控制

三、查看用户与 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/passwd

3.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
done

3.3 查看 SSH 配置中的用户级限制

# 查看 AllowUsers / DenyUsers / AllowGroups / DenyGroups 配置
sudo grep -E "AllowUsers|DenyUsers|AllowGroups|DenyGroups" /etc/ssh/sshd_config

这些配置存在时会覆盖默认的“所有用户均可登录”策略。

3.4 查看当前已登录用户

who
w

3.5 查看被禁止登录的用户

# 查看所有 Shell 为 nologin 或 false 的用户
grep -E "nologin|false" /etc/passwd

四、关键结论

  1. 在标准的、安全的 Linux 服务器上,只有 root 和 UID >= 1000 的手动创建用户才具备登录权限
  2. 系统用户(UID 1-999)的 Shell 均为 /usr/sbin/nologin/bin/false,从系统底层禁止登录
  3. 系统用户即使配置了 SSH 密钥,也无法登录,因为认证通过后 Shell 检查会直接拒绝
  4. 系统用户的设计目的是让每个软件/服务拥有独立的权限,遵循最小权限原则
  5. 若要将手动创建用户的登录权限移除,只需将其 Shell 改为 /usr/sbin/nologin 即可,无需删除用户

标签: none

添加新评论