コンテキスト

コンテキスト

コンテキスト

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

質問

sudoに他のTTYからパスワードを読むように指示する方法は?

これにより、rsyncローカルコンピュータのある端末ウィンドウで実行し、別の端末ウィンドウを使用してサーバーへの(別々の)SSH接続を開き、そこにsudoパスワードを提供できます。

expect同様のことができると考えられる唯一の方法は、名前付きパイプからパスワードを読み取るスクリプトの周りにsudoを使用し、他の端末でそのパイプに書き込むことです。

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

答え1

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

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\!"

標準入力ではパスワードの入力を求められ、端末は不要です。

ただし、実行する特定のケースでは、ルートSSHログインを許可する方が良いですが、SSHキーとrsyncに制限されたコマンドのみを使用することをお勧めします。これには良い資料がありますここ

答え2

努力する:

ssh userfoo@host "sudo -S p'enter pw: ' [command] "

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

関連情報