“passwd root --stdin”会将我的密码设置为什么?

“passwd root --stdin”会将我的密码设置为什么?

我跑:

sshpass -p 'OldPassword' ssh -o StrictHostKeyChecking=no [email protected] 'echo "Te3EQeF2U!-Em_C3eBU6A&a=u2$e28*c" | passwd root --stdin'

没有意识到这echo "Te3EQeF2U!-Em_C3eBU6A&a=u2$e28*c"bash: !-Em_C3eBU6A: event not found由于我的密码中的特殊字符造成的。

基于此,有人能算出它可能将我的密码设置为什么吗?

答案1

你能试一下Te3EQeF2U!-Em_C3eBU6A&a=u2*c吗 ?在虚拟机中复制时这对我有用。

作为参考,这就是我所做的。

在 CentOS 虚拟机上:

$ mv /usr/bin/passwd /usr/bin/passwd.orig
$ vim /usr/bin/passwd
<INSERT>
while read line
do
  echo "$line" >> /tmp/passwd
done < /dev/stdin
<SAVE>

这会将二进制文件替换passwd为采用与 相同输入passwd --stdin并简单地将其写入的二进制文件/tmp/passwd

然后当我跑的时候sshpass -p '<VM-PASSWORD>' ssh -o StrictHostKeyChecking=no root@<VM-IP> 'echo "Te3EQeF2U!-Em_C3eBU6A&a=u2$e28*c" | passwd root --stdin'我进去Te3EQeF2U!-Em_C3eBU6A&a=u2*c/tmp/passwd

完成后,只需将原始passwd二进制文件移回原处即可。

答案2

为什么不直接使用echo 'root:password' | chpasswd(或者... | chpasswd -e如果密码已经加密)?这就是chpasswd目的。请参阅man chpasswd获取详细信息和其他选项。

您还需要正确引用和/或密码字符串。您当然不希望它用双引号引起来,因为它包含$e28(它将扩展为变量的值$e28,该值可能为空)。

因此,您需要转义$as \$,或者需要用单引号引用整个密码字符串。这有点困难,因为ssh命令已经用单引号引起来了。幸运的是,有一种标准且可靠的方法可以在单引号内嵌入单引号,即使用'\''

sshpass -p 'OldPassword' ssh -o StrictHostKeyChecking=no \
    [email protected] 'echo '\''root:Te3EQeF2U!-Em_C3eBU6A&a=u2$e28*c'\'' | chpasswd'

更好的是,使用这样的东西会更简单:

echo 'root:Te3EQeF2U!-Em_C3eBU6A&a=u2$e28*c' | ssh [email protected] chpasswd

相关内容