私は走る:
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