自分のマシンのフォルダをリモートマシンのフォルダと同期したい。リモートフォルダーは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
これは私が思いついた解決策です:
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
ミッションのビット!
この解決策を試してください。 sudoersファイル(/etc/sudoers
)ユーザーを次のように設定します。
username ALL= NOPASSWD:/usr/bin/rsync
NOPASSWD:/usr/bin/rsync
は、ユーザーがSudo
を実行したときに/usr/bin/rsync
または単にrsync
で、パスワードは必要ありません。
次に、元の--rsync-path="Sudo rsync"
は動作するはずです。
このブログの解決策は私にとって本当にうまくいきました: 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でうまく動作します。
Sudo
にパスワードを提供する方法が必要です。 askpass
プログラムは、通常のメカニズムが利用できないときにパスワードを要求するように設計されています。ユーザーIDは1つのオプションであるため、Sudo
を実行するときにパスワードを要求しないようにrsync
を設定します。
私は通常、このような場合に適切な制限を設けて、鍵ベースのログインを構成します。 rsync
だけをrootとして実行する制限付きキーを設定すると、この種のことはより簡単になります。もう1つの方法は、rsycnd
プロセスを使用してリモート要求を処理することです。この構成は、適用可能なさまざまな制限を提供します。
編集: LinuxでのBackupPCのセットアップ に関する私の投稿の「クライアントでのユーザーIDの作成」セクションに、キーベースのLoingのキーをセットアップするスクリプトを含めました。スクリプトに示されているように、キーの使用を制限することで実行できるいくつかのことを詳しく説明しているssh_configのドキュメントも参照してください。
リモートマシン上
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/
既存の答えの複雑さに驚いています。パスワードを使用せずにrootとしてリモートホストに接続できるように、システム(PCおよびリモートホスト)を構成するのはfarより簡単で便利です。 。そして、それの見た目とは異なり、 それも安全です 。
リモートホストの/root/.ssh/authorized_keysにある行が存在し、マシンがPCからのルートコマンドを受け入れることを忘れないでください。
パスワード認証を維持したいので(NOPASSWD
やキーを使用したくない)、Ubuntu 14.04の場合、次のように機能しました。
tty_tickets
(Debianでサポートされている必要があります。/etc/sudoers.d/
を参照)の一時ファイルを使用して/etc/sudoers.d/README
を無効にし、「ユーザーのキャッシュされた認証情報を更新する」ことにより、リモートマシンでSudo
を「開く」 「Sudoタイムアウトをさらに15分間延長します」rsync
をSudo
で実行します/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/
内のファイルを毎回実行する必要があるため、その変更は受け入れられることに注意してください。
わかりましたので、ここにいくつかのオプションがあります。
上記のものは、(両方の)反対側のSudo権限を持つ通常のユーザーとしてrsyncに関してはかなり良いです。
私はこれと同じ問題を抱えていましたが、唯一の違いは、これを夜間にcronジョブとして実行したかったことです。
私はssh-keysを使用します(これにより、非常に安全でありながら、パスワード認証なしでリモートホストにログインすることが可能になります!!)
ssh-keygen
いくつかのオプションが表示されます。毎回Enterキーを押すだけです(パスワードを設定しないでください(入力しないでください)。
このコマンドは、2つの異なるキーを作成します。 1. id_rsa_pubキー:このキーは、リモート(宛先サーバー)ホストにコピーする必要があります。 2. id_rsa:これは秘密鍵であり、この鍵を台無しにしたくない。誰もこのキーを読み取れないようにしてください(読み取りアクセス許可)。あなただけがこのキーを見る権利を持つべきです。
ssh-copy-id [email protected]
デフォルトのsshアクセスのパスワードを入力するように求められます。パスワードを入力するだけで、ssh-copy-idコマンドが残りの作業を行います。
パスワードの入力を求めるプロンプトが表示されない場合は、テストが成功したと見なすことができます。
これで、常にパスワードを入力しなくても、リモートホストに対して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を実行してください。
別の方法は、リモートマシンで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サーバーとして機能できる場合にのみ機能します。
私の回避策は--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"