Linux服务器的账户密码无法直接查询明文,因为系统只存储经过哈希加密的散列值;我们能做的是查看账户列表、密码状态,并在忘记密码时通过合法途径重置。今天这篇文章,我就以多年运维踩坑的经验,带你走一遍“查密码”的全流程,从原理到实操,一次讲透。
密码到底“藏”在哪:先弄懂验证机制
很多朋友第一次接触Linux,总习惯用Windows的思路去想问题密码是不是存在某个文件里?打开就能看到?在Linux世界中,密码永远不会以明文形式出现在磁盘上,哪怕是root账户,它的密码也只是一长串毫无规律的字符。
系统真正保存的,是密码经过单向哈希算法(如SHA-512)处理后的散列值,这个值放在/etc/shadow文件里,只有root用户才有权限读取。
账户信息与密码文件的分工
/etc/passwd:存放用户名、UID、GID、家目录、登录Shell等基础信息,这里的密码位通常是一个x占位符,表示真正的密码在shadow文件里。/etc/shadow:这才是重头戏,每行代表一个账户,格式为“用户名:加密后的密码:最近修改时间:最小修改天数:最大有效天数:警告天数:宽限天数:失效日期”。
所以你瞧,“查看密码”这件事,准确的说法应该是“查看密码哈希值”或“检查密码策略”。
查看登录账户与密码状态:三条实用命令
既然查不到明文,那我们到底能查什么?能查的东西其实不少,而且对日常工作很有帮助。
用getent快速列出所有可登录账户
想要知道系统里有哪几个账户能用来登录,一行命令搞定:
getent passwd | grep -E ‘(/bin/bash|/bin/zsh|/bin/sh)$’
这样能过滤出拥有真实Shell的账户,快速定位“人”用的账号,而不是那些系统服务账户,想看得更详细,配合cut或awk把字段拆开:
awk -F: ‘$7 ~ /(bash|zsh|sh)$/ {print $1}’ /etc/passwd
查看密码哈希与过期策略
这可是个技术活,用root身份查看/etc/shadow文件,能看到每位用户的密码哈希值前缀,比如$6$代表SHA-512加密,$y$是较新的Yescrypt算法。这正是判断密码强度的关键线索。
还能检查账户何时到期、密码是否已过期:
chage -l testuser
这条命令会显示出密码最后一次修改日期、密码有效期、账户失效时间等信息。
确认当前有哪些人在线
有时候你更关心的不是“密码是什么”,而是“谁在用”,这时候用:
who last
who显示当前在线用户,last显示最近的登录记录,包含IP和登录时间,这些数据能帮你发现异常登录的苗头。
linux服务器登录密码忘了怎么办?三种实战破解法
如果只是忘了root密码,不要慌,也不用重装系统,业内专家指出,通过进入单用户模式或救援模式重置密码,是处理此类问题最常用的方式。
通过GRUB启动菜单重置root密码
这是最经典的操作路径,适用于大多数物理服务器和虚拟机:
- 重启服务器,在GRUB启动菜单界面,选中内核版本那一行,按
e进入编辑模式。 - 找到以
linux或linux16开头的那一行,在末尾追加rd.break enforcing=0(CentOS/RHEL常用)或直接输入single(Ubuntu 18.04及更早版本)。 - 按
Ctrl+X或F10启动进入紧急模式。 - 依次执行:
mount -o remount,rw /sysroot chroot /sysroot passwd root touch /.autorelabel exit reboot
使用init=/bin/sh参数(适用于部分云服务器)
如果GRUB菜单被隐藏或保护,可以尝试在启动参数中追加init=/bin/sh,直接以root权限进入一个最小化的Shell环境,然后重挂载根文件系统并修改密码,具体命令:
mount -o remount,rw / passwd root exec /sbin/init
利用Live CD或救援光盘
对于物理机,挂载系统安装光盘或U盘启动盘,选择“救援模式”,系统会自动检测已安装的Linux环境,并挂载到/mnt/sysimage下,之后用chroot /mnt/sysimage切换进去,敲passwd即可,这套流程对多系统引导的服务器同样适用。
密码安全与合规:别为了省事埋雷
“查密码”这个词的背后,往往藏着安全管理的隐患。行业共识认为,密码策略的严格程度,直接决定了服务器被爆破的成功率。
定期审计账户的密码时效
建议每个月跑一遍:
awk -F: ‘($2 != “!” && $2 != “”) {print $1, $2}’ /etc/shadow
这能筛出所有设置了真实密码的账户,检查是否有不使用的旧账号依然保持着有效密码。
为高权限账户开启双因子认证
对于root或具有sudo权限的账户,单靠密码并不安全,建议使用Google Authenticator或FreeOTP来实现SSH登录的动态口令验证,这样即使密码被泄露,攻击者也无法直接登录。
禁止root直接SSH登录
修改/etc/ssh/sshd_config,设置PermitRootLogin no,使用普通用户登录后再用su -或sudo切换至root,这一步能大幅降低被暴力破解的风险。
密码复杂度与更换周期
设定类似以下策略:
- 最短密码长度:12位以上
- 包含大小写字母、数字、特殊字符中的至少三种
- 密码最长使用时间:90天
- 历史密码不可重复使用最近5次
通过/etc/login.defs和/etc/pam.d/system-auth配置文件即可落实。
常见问题速查表与场景对比
| 使用场景 | 推荐做法 | 风险等级 |
|---|---|---|
| 忘记root密码 | 单用户模式重置 | 低(需物理或控制台权限) |
| 查看当前在线用户 | who、last |
无风险 |
| 查看密码哈希值 | cat /etc/shadow |
高(泄露即被撞库) |
| 批量修改用户密码 | echo “密码” \| passwd --stdin 用户名 |
中(命令历史会记录) |
| 检查密码过期时间 | chage -l 用户名 |
无风险 |
| 远程SSH登录失败排查 | 查看/var/log/secure |
无风险 |
有关linux服务器登录密码的常见疑问
能不能通过复制shadow文件内容来“破解”密码?
从理论上讲,哈希值是不可逆的,但弱密码确实可以通过字典攻击或暴力破解还原,这就是为什么一定要用强密码的原因,如果shadow文件泄露,攻击者拥有大量计算资源时,简单密码将毫无抵抗力。防止shadow文件被非授权读取,是安全底线。
修改密码后,已经登录的会话会中断吗?
修改密码不会强制踢出已经建立的SSH会话,已经登录的会话继续有效,直到手动退出或连接超时,要立即终止所有会话,可以用pkill -9 -u 用户名强制下线。
为什么有的账户在shadow文件里密码字段是或?
这说明该账户被锁定了,无法使用密码登录,表示密码被锁定,通常表示该账户从未设置过密码(系统服务账户常用),解锁账户用passwd -u 用户名,重新设置密码用passwd 用户名。
回到最初的问题,查登录密码这件事,正确答案永远不是“看明文”,而是理解系统如何存储密码、如何合法重置密码,以及如何通过策略让密码真正安全起来,把这些基础打牢,比你翻遍整个磁盘找那个不存在的密码文件,有用得多。在Linux里,管理密码的核心是权限和策略,而不是破解。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/789535.html


