无法通过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。