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