我跑:
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