web-dev-qa-db-ja.com

リモートマシンでroot権限でrsyncを実行する

自分のマシンのフォルダをリモートマシンのフォルダと同期したい。リモートフォルダーはrootによってのみ操作できます。リモートマシンにSudoを使用できるアカウントを持っています。リモートマシンでroot権限を持つようにrsyncを実行するにはどうすればよいですか?

私は以下を試しました:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder --delete --rsync-path="Sudo rsync"

しかし、(パスワードを入力した後)次のエラーが発生します。

Sudo: no tty present and no askpass program specified
37
Peter

これは私が思いついた解決策です:

rsync -R -avz -e ssh --rsync-path="echo mypassword | Sudo -S  mkdir -p /remote/lovely/folder && Sudo rsync" /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder --delete

ミッションのビット!

12
Peter

この解決策を試してください。 sudoersファイル(/etc/sudoers)ユーザーを次のように設定します。

username ALL= NOPASSWD:/usr/bin/rsync

NOPASSWD:/usr/bin/rsyncは、ユーザーがSudoを実行したときに/usr/bin/rsyncまたは単にrsyncで、パスワードは必要ありません。

次に、元の--rsync-path="Sudo rsync"は動作するはずです。

14
dynabaul

このブログの解決策は私にとって本当にうまくいきました: http://www.pplux.com/2009/02/07/rsync-root-and-Sudo/

基本的に:

stty -echo; ssh myUser@REMOTE_SERVER "Sudo -v"; stty echo  
rsync -avze ssh --rsync-path='Sudo rsync' myUser@REMOTE_SERVER:/REMOTE_PATH/ LOCAL_PATH 

最初の行では、画面にパスワードを表示せずに、インタラクティブなパスワードを入力できます。 Ubuntu 9.04でうまく動作します。

10
Andrew

Sudoにパスワードを提供する方法が必要です。 askpassプログラムは、通常のメカニズムが利用できないときにパスワードを要求するように設計されています。ユーザーIDは1つのオプションであるため、Sudoを実行するときにパスワードを要求しないようにrsyncを設定します。

私は通常、このような場合に適切な制限を設けて、鍵ベースのログインを構成します。 rsyncだけをrootとして実行する制限付きキーを設定すると、この種のことはより簡単になります。もう1つの方法は、rsycndプロセスを使用してリモート要求を処理することです。この構成は、適用可能なさまざまな制限を提供します。

編集: LinuxでのBackupPCのセットアップ に関する私の投稿の「クライアントでのユーザーIDの作成」セクションに、キーベースのLoingのキーをセットアップするスクリプトを含めました。スクリプトに示されているように、キーの使用を制限することで実行できるいくつかのことを詳しく説明しているssh_configのドキュメントも参照してください。

4
BillThor

リモートマシン上

Sudo apt install ssh-askpass
which ssh-askpass

次にローカルマシンで

rsync -av -e 'ssh -X' --rsync-path='Sudo_ASKPASS=/usr/libexec/openssh/ssh-askpass Sudo -A rsync' /some/local/path user@remote:/some/remote/path

リモートマシン上の実際のパスでssh-askpassへのパスを置き換えます

ソース: http://unix.bris.ac.uk/2015/08/04/rsync-between-two-hosts-using-Sudo-and-a-password-Prompt/

3
wotanii

既存の答えの複雑さに驚いています。パスワードを使用せずにrootとしてリモートホストに接続できるように、システム(PCおよびリモートホスト)を構成するのはfarより簡単で便利です。 。そして、それの見た目とは異なり、 それも安全です

  1. リモートホストで、/ etc/ssh/sshd_configに「PermitRootLogin without-password」という行があることを確認します(多くのディストリビューションでは、デフォルトでそこにあります)。これにより、rootは安全でないパスワードプロンプト以外の認証方法を使用してSSHシェルを取得できます。
  2. (まだ方法がわからない場合) 多くのチュートリアル に従って、sshを介してパスワードなしのログインを取得する
  3. 通常どおり、パスワードのプロンプトなしでrsyncを使用します。

リモートホストの/root/.ssh/authorized_keysにある行が存在し、マシンがPCからのルートコマンドを受け入れることを忘れないでください。

2
ndemou

パスワード認証を維持したいので(NOPASSWDやキーを使用したくない)、Ubuntu 14.04の場合、次のように機能しました。

  • tty_tickets(Debianでサポートされている必要があります。/etc/sudoers.d/を参照)の一時ファイルを使用して/etc/sudoers.d/READMEを無効にし、「ユーザーのキャッシュされた認証情報を更新する」ことにより、リモートマシンでSudoを「開く」 「Sudoタイムアウトをさらに15分間延長します」
  • 他の回答に示されているように、rsyncSudoで実行します
  • /etc/sudoers.d/の一時ファイルを削除してリモートマシンのSudoを「閉じる」と、tty_ticketsが再び有効になります

...または、コマンドラインで:

ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | Sudo tee /etc/sudoers.d/temp; Sudo -v'
rsync -aP -e 'ssh' '--rsync-path=Sudo rsync' /etc/Pulse/client.conf $REMOTEPC:/etc/Pulse/client-copy.conf
ssh -t $REMOTEPC 'Sudo rm -v /etc/sudoers.d/temp; Sudo -v'

これらは、ローカルマシンでこれらのコマンドを実行したときに受け取る応答です。

$ ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | Sudo tee /etc/sudoers.d/temp; Sudo -v'
remoteuser@$REMOTEPC's password: 
[Sudo] password for remoteuser: 
Defaults !tty_tickets
Connection to $REMOTEPC closed.

$ rsync -aP -e 'ssh' '--rsync-path=Sudo rsync' /etc/Pulse/client.conf $REMOTEPC:/etc/Pulse/client-copy.conf
remoteuser@$REMOTEPC's password: 
sending incremental file list
client.conf
           1269 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/1)

$ ssh -t $REMOTEPC 'Sudo rm -v /etc/sudoers.d/temp; Sudo -v'
remoteuser@$REMOTEPC's password: 
removed ‘/etc/sudoers.d/temp’
[Sudo] password for remoteuser: 
Connection to $REMOTEPC closed.

Sudo -vは、/etc/sudoers.d/内のファイルを毎回実行する必要があるため、その変更は受け入れられることに注意してください。

1
sdaau

バックグラウンドでcronjobとして実行

わかりましたので、ここにいくつかのオプションがあります。

上記のものは、(両方の)反対側のSudo権限を持つ通常のユーザーとしてrsyncに関してはかなり良いです。

私はこれと同じ問題を抱えていましたが、唯一の違いは、これを夜間にcronジョブとして実行したかったことです。

ステップ1

私はssh-keysを使用します(これにより、非常に安全でありながら、パスワード認証なしでリモートホストにログインすることが可能になります!!)

  1. 次のコマンドを使用して、ソースコンピューター(サーバー)にsshキーを作成します。
ssh-keygen

いくつかのオプションが表示されます。毎回Enterキーを押すだけです(パスワードを設定しないでください(入力しないでください)。

このコマンドは、2つの異なるキーを作成します。 1. id_rsa_pubキー:このキーは、リモート(宛先サーバー)ホストにコピーする必要があります。 2. id_rsa:これは秘密鍵であり、この鍵を台無しにしたくない。誰もこのキーを読み取れないようにしてください(読み取りアクセス許可)。あなただけがこのキーを見る権利を持つべきです。

ステップ2

  1. キーを生成したら、今度はid_rsa_pubキーをリモートコンピューター(サーバー)にコピーします。これは、次のコマンドで実行できます。
ssh-copy-id [email protected]

デフォルトのsshアクセスのパスワードを入力するように求められます。パスワードを入力するだけで、ssh-copy-idコマンドが残りの作業を行います。

テストする時間

  1. 次に、リモートサーバー(ssh-copy-idコマンドで使用した宛先)にsshでログインします。

パスワードの入力を求めるプロンプトが表示されない場合は、テストが成功したと見なすことができます。

これで、常にパスワードを入力しなくても、リモートホストに対してrsyncコマンドを実行できます。また、ソースホスト内から宛先ホストでオートコンプリートすることもできます。あなたが私に尋ねたらそれはかなりきちんとしています(例ssh 192.168.1.100: "タブボタンを2回押してコマンドの残りをオートコンプリートします。IPアドレス192.168.1.100は宛先サーバーのIPアドレスであることに注意してください)。

これで、通常の「Sudo」ユーザーを使用してcronjobからrsyncコマンドを実行できます(ユーザーrootを使用するために、sshの両方のサーバーにrootアクセスする必要はありません)。

上記と同じことを行いますが、オプションを1つ追加します。

Sudo rsync --rsync-path="Sudo rsync" -az --delete -e "ssh -p 1022 -l **buser** -i /home/**buser**/.ssh/id_rsa" /path/to/rsync [email protected]:

Buser(BackupUSERは、sshキーを使用して、パスワードの入力を求められることなくsshを介してログインするユーザーです)に注意してください。 buserを、ssh-keyログイン方式を使用するユーザー名に変更します。

コマンドの最後の文字が":"で終わっていることに注意してください。これは、リモートユーザーのホームフォルダーにファイルをコピーしていることを意味します。ホームディレクトリ外の別の場所に移動したい場合は、":"の後に絶対パスを追加することでこれを実現できます。次に例を示します。

Sudo rsync --rsync-path="Sudo rsync" -az --delete -e "ssh -p 1022 -l **buser** -i /home/**buser**/.ssh/id_rsa" /path/to/rsync [email protected]:/srv/backup_folder

オプション「ssh -p 1022 -l username -i /home/username/.ssh/id_rsa」の説明

ssh -p 1022 sshはデフォルトのポート22を使用します。私のssh-serverがポート1022をリッスンしているため、デフォルトのポートから逸脱しています。

-lユーザー名ssh-key認証方式でリモートホストにログインできるユーザー定義。私の場合、これはユーザーBUSERです。

-i(Identityの略)ssh-keygenコマンドで作成した秘密鍵を使用します。これは、この鍵が保存されている場所を指します。デフォルトの場所は、ssh( /home/username/.ssh/id_rsa)

これが他のユーザーがcronを介して安全にバックアップを自動化するのに役立つことを願っています。

再確認

ソースマシン(サーバー)から、コマンド(スクリプト)をROOTユーザーとして実行していることを確認します(cronjobを作成する場合は、cronjobを作成するときにユーザーがroot(#)であることを確認する必要があります)

移行先サーバーのユーザーにSudo権限があることを確認します。

キースの回答にあるように、必ずvisudoを実行してください。

0
Rykle Baron

別の方法は、リモートマシンでrsyncを開始して、アクセス許可の制限を回避することです。の代わりに:

rsync /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder

できるよ:

ssh [email protected] 'rsync [email protected]:/home/ubuntu/my/lovely/folder /remote/lovely/folder'

どこ y.y.y.yはローカルマシンのIPアドレスです。これは、ローカルマシンがSSHサーバーとして機能できる場合にのみ機能します。

0
Keith

私の回避策は--rsync-path="echo PASSWORD | Sudo -Sv && Sudo rsync"を追加することです

例:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder --delete --rsync-path="echo <PASSWORD> | Sudo -Sv && Sudo rsync"

通常、コマンドラインのワンライナーにパスワードを入力することはお勧めできません。たとえば、プロセスツリーに表示されます。このタイプのステートメントの実際のパスワードを$(cat my_password.txt)に置き換えることがあります。

rsync -avz -e ssh /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder --delete --rsync-path="cat my_password.txt | Sudo -Sv && Sudo rsync"

0
Bulat