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