![コンテクスト](https://rvso.com/image/50564/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AF%E3%82%B9%E3%83%88.png)
コンテクスト
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 パスワードを入力できます。
expect
そのようなことを行う唯一の方法は、名前付きパイプからパスワードを読み取り、他の端末からそのパイプに書き込む sudo 関連のスクリプトを使用することです。
注: これは実用的な目的というよりも、実験と学習のためです。rsyncでsudoを使用する方法を調べようとしているのではない、私はすでにそれについて見つけられるものはすべて読みました。
答え1
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キーとrsyncコマンドのみを使用してルートSSHログインを許可する方が良いかもしれません。これについては良いリソースがあります。ここ。
答え2
試す:
ssh userfoo@host "sudo -S p'enter pw: ' [command] "
enter pw:
これにより、ローカル ホスト/ターミナルに表示されるパスワード プロンプト (" ") が発行されます。この方法の欠点は、ターミナル ウィンドウにパスワードが平文で表示されるため、セキュリティ上のリスクが生じることです。パスワードはローカルには保存されません.bash_history
が、ターミナル ウィンドウのスクロールバック履歴には残ります。したがって、たとえば Konsole を使用している場合は、Ctrl+ Shift+を使用してKこれをクリアします。