web-dev-qa-db-ja.com

ssh経由でsuを使用してコマンドをパイプすることが可能

管理している一連のアカウントのログインパスワードをリモートで更新する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コマンドにパイプするにはどうすればよいですか。 (または、一部のユーザーのパスワードが正しいかどうかをリモートでテストします)。

3
user48956

パスワードをsuにパイプし、次にsshにパイプします。

以下の例。 foopassがユーザーfooの正しいパスワードであることに注意してください。これにより、foopassは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
$
1
steve