suを使用してSSHを介してコマンドをパイプできます。

suを使用してSSHを介してコマンドをパイプできます。

私が管理している一連のアカウントのログインパスワードをリモートで更新するためにPythonスクリプトを作成しようとしています。 Pythonを使用して、SSHプロセスのstdinを介してリモートコマンドを正常に送信できました。ところで、リモートパスワードが正しく設定されているかどうかをテストしたいと思います。これをリモートで実行できます。次のようにリモートで実行できます。

[localhost]% ssh -t -o RequestTTY=true  user@host
[host]% su user -c true

メッセージが表示されたら、パスワードを入力してください。これはうまくいきますが、リモートで次のことを試している場合:

 [localhost]% echo "su user -c true" |  ssh -t -o RequestTTY=true  user@host

私は得る:

su: must be run from a terminal

suにはパスワード(最終的にPythonを介して提供する予定)が必要なので、これが失敗するわけではないことに注意してください。それ以前は失敗します。 suはこのようにパイプを通過するのが好きではありません。

何が起こっているのでしょうか?入力をリモートsuコマンドにパイプする方法(または特定のユーザーのパスワードが正しいことをリモートでテストします。)

答え1

パスワードをでパイプしsu、パイプでパイプしますssh

以下の例foopassはユーザーfooの正しいパスワードなので、idコマンドを実行します。 badpass はユーザー foo の無効なパスワードなので、認証に失敗します。

$ echo "echo foopass | su foo -c id" | ssh -t -o RequestTTY=yes steve@localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
Password: uid=1001(foo) gid=1003(foo) groups=1003(foo) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
$ echo "echo badpass | su foo -c id" | ssh -t -o RequestTTY=yes steve@localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
Password: su: Authentication failure
$

関連情報