web-dev-qa-db-ja.com

sudo askpass:他のttyから質問する

環境

サーバーのrsyncバックアップを設定したいので、次のコマンドを実行します

rsync -r -e ssh --rsync-path="Sudo rsync" [email protected]:/ /backup/

理想的には、そのコマンドは私の秘密sshキーのパスワードを要求し、次に接続し、次にrsyncuserのSudoパスワードを要求し、サーバー上でrsyncを実行します。しかし、私は悪名高いエラーを受け取りました:

Sudo: no tty present and no askpass program specified

したがって、これを/etc/sudoersに追加する必要がありました(Sudo visudoを使用)。これにより、基本的に、ユーザーrsyncuserにシステムへのパスワードなしの完全な読み取り/書き込みアクセスが許可されますが、これは私の好みではありません。

rsyncuser ALL= NOPASSWD:/usr/bin/rsync

質問

代わりに、たとえば別のTTYからパスワードを読み取るようにSudoに指示するにはどうすればよいですか?

そうすれば、ローカルマシンの1つのターミナルウィンドウでrsyncを実行し、別のターミナルウィンドウを使用して、サーバーへの(場合によっては別の)ssh接続を開き、そこでSudoパスワードを指定できます。

そのようなことをする唯一の方法は、Sudoの周りでexpectスクリプトを使用することです。このスクリプトは、名前付きパイプからパスワードを読み取り、他の端末からそのパイプに書き込みます。

注:これは、実際的な目的というよりも、実行と学習のためのものですrsyncでSudoを使用する方法を見つけようとはしていません。私はそれについて見つけることができるすべてをすでに読みました。

6

Sudoは、(あなたの場合のように)端末から実行されていない場合、または-Aが設定されている場合、環境変数Sudo_ASKPASSを読み取ります。これをコマンドとして使用して、パスワードを取得するために実行します。例えば:

echo -e '#!/bin/sh\nhead -n 1' > ~/bin/reader
chmod a+x ~/bin/reader
export Sudo_ASKPASS="$HOME/bin/reader"
Sudo -A echo "I'm root\!"

Stdinでパスワードの入力を求められ、端末は必要ありません。

ただし、実行しようとしている特定のケースでは、ルートSSHログインを許可する方がよい場合がありますが、SSHキーとコマンドをrsyncに制限する必要があります。これには良いリソースがあります ここ

6

試してみてください:

ssh userfoo@Host "Sudo -S p'enter pw: ' [command] "

これにより、パスワードプロンプト( "enter pw: ")ローカルホスト/端末に表示されます。これの欠点は、パスワードが端末ウィンドウにクリアで表示されることによるセキュリティリスクです。ローカルホストに保存されません.bash_historyですが、これはターミナルウィンドウのスクロールバック履歴です。したがって、たとえばKonsoleを使用している場合は、 Ctrl+Shift+K それをクリアします。

0
zenGator