コンテキスト
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
sudo
SUDO_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してください。