我有 10 台 Linux 服务器需要锁定,方法是一次性重置每个用户的密码。这背后的故事很长,但总体思路是我需要它在特定时间非常快速地完成。我将为所有用户帐户使用一个单一的、强密码(只是最初),因此这不需要从密码文件或类似的东西中读取。
因此我需要编写此脚本的最佳方式,以便我可以一次性重置所有密码。我可以使用命令提取用户帐户列表cat /etc/passwd | cut -f1 -d:
,但最终会包括所有帐户,包括我认为不应该乱动的系统帐户。
那么我最好的选择是什么?
笔记!重置密码时,您还需要确保从文件中清除所有多余的内容~/.ssh/authorized_keys
。直到后来才想起这一点 - 值得庆幸的是,我几乎把服务器都牢牢地锁住了,authorized_keys 中除了服务器到服务器的内容外什么都没有。
答案1
您可以选择 UID >= 500 以确保您只获得真实用户而不是系统帐户,然后使用 passwd 的选项 --stdin 来更改密码。
类似这样的事情应该可以工作:
while IFS=: read u x nn rest; do if [ $nn -ge 500 ]; then echo "YOURSTRONGPASSWORD" |passwd --stdin $u; fi done < /etc/passwd
答案2
您可以使用类似“newusers”命令的命令以批处理模式更新用户密码。创建一个包含用户:密码组合的文件并通过 newusers 加载它... 密码以未加密的形式输入,但在此过程中将被加密。
newusers userpass.txt
userpass.txt 看起来类似于 /etc/passwd 文件。格式相同。
我会将 /etc/passwd 复制到一个新文件,删除系统帐户的行并将第二个字段“x”替换为您想要使用的通用密码,然后使用 newusers 命令重新导入。
答案3
使用以下命令编辑影子数据库:
vipw -s
这也将锁定文件以防止更新,然后使用文本编辑器替换每行包含 pw 字段的第二个字段。
例如,使用:
$ openssl rand -base64 12
gw9H5sqr8YioMdwd
$ openssl passwd -1
Password:
Verifying - Password:
$1$Nx/XBIYy$JGPhkX8DC9uJqggEFuKxP0
然后以 root 身份使用 vipw -s;假设您的文本 $EDITOR/$VISUAL 是 vi(m),那么 vipw 将把您转入该目录,您可以执行以下操作:
:g/^[^:]*:[^*!:][^:]*:/s,:[^:]*,:$1$Nx/XBIYy$JGPhkX8DC9uJqggEFuKxP0:,
这是一个基本的模式匹配,在与该模式匹配的行上进行替换(每行仅一次)。模式匹配排除密码字段为“!”或“*”的行,因此只为已经设置密码的用户设置密码,无论 uid 是什么;这将保护您免受打包系统创建具有高 uid 的“系统”帐户或某些打包程序产生的任何其他无意义的情况的影响。
注意这也会重置 root 密码。如果你想排除这一点,并且 root 在第一行,那么将开头的 :g 替换为 :2,$g