コンテクスト

コンテクスト

コンテクスト

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これをクリアします。

関連情報