root権限でrsyncを実行する

2022-07-19

リモートサーバで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/

 

 

スポンサーリンク

0
0