web-dev-qa-db-ja.com

リモートスクリプトでSudoを使用する場合、「Sudo:申し訳ありませんが、Sudoを実行するにはttyが必要です」

埋め込みスクリプトからリモートマシンで一連のSudoで昇格されたコマンドを実行したいのですが。質問を簡単にするために、私はSudo idを実行して、それがルートであることを教えてもらうだけです。

このスクリプトを実行すると、「Sudo:申し訳ありませんが、Sudoを実行するにはttyが必要です」という問題が発生します。

#!/bin/bash
ssh -t 192.168.1.100<<EOF
Sudo id
EOF

しかし、私がこれを実行したときではありません:

#!/bin/bash
ssh -t 192.168.1.100 Sudo id

SSHのもう一方の端にある強制ttyを尊重する埋め込みスクリプトのファイルの終わりを指定して、最初のスクリプトを取得するにはどうすればよいですか?

4
Andy

最初のものでは、ttyは端末に接続されていないため、sshstdinはありません。これはhereファイルです。実際、(Debianで)同様のコマンドを実行しようとすると、次のエラーが発生します。

Stdinは端末ではないため、疑似端末は割り当てられません。

それを動作させるには、次のようなことができます:

ssh -tt 192.168.1.100 <<EOF
Sudo -S id
password
EOF

パスワードはプレーンテキストであるため、これは良い考えではありません。

更新

プレーンテキストでパスワードをエンコードしないようにする簡単な解決策を見つけました。グラフィカルプログラムを使用してパスワードを入力できます。

ssh -X 192.168.1.100 <<EOF
Sudo_ASKPASS=/usr/lib/ssh/x11-ssh-askpass Sudo -A id
EOF

もちろん、ssh-askpassプログラムを所定の場所にインストールする必要があり、作業しているマシンでXセッションを実行している必要があります。動作するssh-askpassプログラムにはいくつかのバリエーションがあります(Gnome/KDEバージョン)。また、Sudogksuのようなグラフィカルなkdesudo置換プログラムも機能します。

2
Graeme