![在 /etc/shadow 中编写“空”密码脚本](https://linux22.com/image/1342169/%E5%9C%A8%20%2Fetc%2Fshadow%20%E4%B8%AD%E7%BC%96%E5%86%99%E2%80%9C%E7%A9%BA%E2%80%9D%E5%AF%86%E7%A0%81%E8%84%9A%E6%9C%AC.png)
我编写了一个脚本,用于在 Linux 服务器 (Slackware 14.0) 上添加 CVS 和 SVN 用户。此脚本会在必要时创建用户,并从现有 shell 帐户复制用户的 SSH 密钥或生成新的 SSH 密钥。
需要明确的是,这些帐户专门用于 SVN 或 CVS。因此,条目开头/home/${username}/.ssh/authorized_keys
为(以 CVS 为例):
command="/usr/bin/cvs server",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa ....etc...etc...etc...
这些用户永远不会被允许进行实际的 shell 访问 - 他们纯粹是为了通过 SSH 提供对我们的源存储库的访问。
我的问题是,当我添加新用户时,他们/etc/shadow
默认会获得一个空密码。它看起来像:
paddycvs:!:15679:0:99999:7:::
如果我保留影子文件原样(带有!
),SSH 身份验证将失败。要启用 SSH,我必须先passwd
为新用户运行并输入一些内容。
这样做有两个问题。首先,它需要用户输入,而我在这个脚本中不允许输入。其次,它可能会允许用户在物理终端上登录(如果他们有物理访问权限,他们可能有,并且知道秘密密码——好吧,这不太可能)。
我通常阻止用户登录的方法是将他们的 shell 设置为/bin/false
,但如果我这样做,那么 SSH 也不起作用!
有人对编写这个脚本有什么建议吗?我应该简单地使用sed
或其他方法,用预设的加密密码字符串替换影子文件中的相关行吗?或者有更好的方法吗?
干杯 =)
答案1
为了避免锁定问题或弄乱影子文件,你可以使用
echo username:some_string | chpasswd
更具体地说:您实际上可以*
通过执行以下操作在密码字段中使用:
echo "username:*" | chpasswd -e
答案2
你有没有尝试过
passwd -d username
它从中删除特定用户的密码条目/etc/shadow file
。基本上使特定用户以空密码登录。
它只能以 root 或 sudo 用户身份强制执行。
答案3
还有一种不涉及管道的解决方案如下(也可以在 shadow 和 shadow-utils 包中找到):
usermod -p '*' username
答案4
新版本的 OpenSSH 检查 /etc/shadow 以查看帐户是否被禁用。被禁用的帐户带有 !,因此将其更改为 * 即可解决问题。