root権限でrsyncを実行する
リモートサーバでsudo rsync ファイル転送を実施する
webディレクトリがあるディレクトリ等でrysncコマンドを実行すると所有者権限でコピーできないディレクトリやファイルがあったりします。同一サーバー内だとroot でrsyncを使えば問題なく同期できます。
リモートサーバーだとrootで実行してもいいですが、Cron等で実行する場合はパスワードを要求されたりするので難しいです。そもそもセキュリティでrootでSSHログインは好ましくありません。
sudo を使って、root権限でrysncを実行する方法を紹介します。
パスワード無しでSSHログインをおこなう
まずは、パスワードなしでSSHログインできる環境を実行します。
以下では、「admin」ユーザーが、リモート先の 192.168.0.50 のサーバーへパスワード無しでログインする場合です
1.admin ユーザーログインして ssh-keyを登録します。Keyが登録されると秘密鍵(id_rsa)と公開鍵(id_rsa.pub)が生成されています
$ ssh-keygen -t dsa $ ls -l .ssh/ total 16 -rw------- 1 admin admin 668 Sep 11 15:02 id_dsa -rw-r--r-- 1 admin admin 602 Sep 11 15:02 id_dsa.pub -rw-r--r-- 1 admin admin 1540 Sep 2 22:46 known_hosts
2.リモート先で、公開鍵を保存する「~/.ssh/authorized_keys」を作成して、パーミションを「600」に変更します
# 公開鍵を~/.ssh/authorized_keysに追加し、パーミッションを600に変更する。 $ ssh -l admin 192.168.0.50 touch /home/admin/.ssh/authorized_keys $ ssh -l admin 192.168.0.50 chmod 600 /home/admin/.ssh/authorized_keys
3.公開鍵の内容を「~/.ssh/authorized_keys」に保存すると、パスワード無しでログインできるようになります
$ cat ~/.ssh/id_dsa.pub | ssh -l admin 192.168.0.50 'cat >> '/home/admin/.ssh/authorized_keys
パスワード無しでsudo できるようにする
転送先のサーバーでsudo をおこなうばあいに、パスワードを要求されないように設定します
# visudo # rsyncのみsudo でパスワードなしの場合 admin ALL=(ALL) NOPASSWD: /usr/bin/rsync # すべてのコマンドでsudo でパスワードを要求しない場合 admin ALL=(ALL) NOPASSWD: ALL
sudo + rysncでファイル転送する
以下のようなディレクトリに、rootのみ読取り可能なファイルが有る場合に、rsyncでファイル転送をおこなうとrootのみ読取り可能なファイルは転送されません
# 転送元のディレクトリのファイルは以下のようになります $ ls -l /var/tmp/test -r-------- 1 root root 0 Nov 25 12:31 test1 -r--r----- 1 root root 0 Nov 25 12:31 test2 -rw-r--r-- 1 root root 0 Nov 25 12:31 test3 $ rsync -avz -e 192.168.0.50:/var/tmp/test/ /var/tmp/test/ receiving incremental file list rsync: send_files failed to open "/var/tmp/test/test1": Permission denied (13) rsync: send_files failed to open "/var/tmp/test/test2": Permission denied (13) ./ test3 sent 84 bytes received 357 bytes 882.00 bytes/sec total size is 0 speedup is 0.00 # 転送されたファイルを確認します $ ll /var/tmp/test/ total 0 -rw-r--r-- 1 expdev root 0 Nov 25 12:31 test3
「–rsync-path="sudo rsync"」のオプションをつけてrysncを実行すれば、root権限でrsyncが実行できます。
$ rsync -avz --rsync-path="sudo rsync" 192.168.0.50:/var/tmp/test/ /var/tmp/test/ receiving incremental file list test1 test2 sent 62 bytes received 200 bytes 524.00 bytes/sec total size is 0 speedup is 0.00 # rootのみ読取り可能なファイルも転送されます $ ls -l /var/tmp/test/ total 0 -r-------- 1 expdev root 0 Nov 25 12:31 test1 -r--r----- 1 expdev root 0 Nov 25 12:31 test2 -rw-r--r-- 1 expdev root 0 Nov 25 12:31 test3 # sshのポートを変えている場合は、"ssh -p [ポート番号] でポート番号を指定できます $ rsync -avz -e "ssh -p 1022" --rsync-path="sudo rsync" 192.168.0.50:/var/tmp/test/ /var/tmp/test/
ディスカッション
ピンバック & トラックバック一覧
[…] WordPressのデプロイを楽にしたい! Cloud Build導入のすすめ 感謝の気持ちをCloud KMSで暗号化して送ってみた rsync でディレクトリの同期(バックアップ) 【 rsync 】コマンド(その1)――ファイルやディレクトリを同期する root権限でrsyncを実行する […]