"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

関連情報