我尝试通过 ssh(具有 root 权限)创建一个带有密码的用户,如下所示:
ssh [email protected] useradd -p $(openssl passwd -1 1234) newuser
通过这样做,我可以成功创建一个名为的帐户newuser
,但我无法使用预期的密码登录(即1234
)
如果我添加双引号则没有什么区别:
ssh [email protected] "useradd -p $(openssl passwd -1 1234) newuser"
然后我想知道我是否可以生成散列密码并将其作为变量保存在本地,但仍然没有运气。
password=$(openssl passwd -1 1234)
ssh [email protected] "useradd -p $password newuser"
我是否遗漏了什么?提前致谢!
答案1
这是一个经典的引用问题。
问题:没有任何引号或双引号,命令替换($()
)和变量扩展($
返回的散列密码中的 sopenssl
被视为变量指示符)正在本地环境中完成,而不是在远程 shell 上完成。
解决方案:在本地 shell 上使用单引号括住useradd
命令,ssh
以防止在本地环境中进行命令替换和变量扩展,而是让扩展在远程非登录、非交互式 shell 上进行:
ssh [email protected] 'useradd -p "$(openssl passwd -1 1234)" newuser'
注意引文。
安全问题:
应禁用SSH
root
登录,如果必须启用它,则应仅允许基于密钥的身份验证MD5 已经被破解,如果没有加盐,你就会受到简单的彩虹表攻击(甚至不需要暴力破解/字典攻击);
openssl passwd
不过确实会产生随机盐。无论如何,你应该考虑使用加盐的 SHA-2作为命令参数传递的密码可能会被(远程)系统中的其他进程看到;这取决于您的
procfs
安装方式(查看hidepid
),以及命令是否重写自身(在这种情况下大概不会)
答案2
正如@heemayl 所说,MD5 密码哈希算法已经过时,当前系统采用较新的基于 SHA-2 的密码哈希算法,该算法具有可自定义的工作因子。但 OpenSSL 命令行工具似乎不支持这些算法。
实用chpasswd
功能但是,将允许您根据系统设置更改用户的密码。
这应该允许您创建新用户并在远程端更改其密码。
echo "newuser:newpass" | ssh [email protected] 'useradd newuser; chpasswd'
chpasswd
从标准输入而不是命令行获取用户名和密码。这实际上是一个优势,因为命令行参数对系统上的所有其他进程都是可见的,因此如果openssl passwd
在远程运行,密码将立即对系统上的所有进程可见。
我不确定是否有现成的命令行实用程序用于生成系统crypt(3)
函数已知的密码哈希值。Perl 有crypt
功能内置,但仍然需要生成适当的盐。