web-dev-qa-db-ja.com

rsync転送中に特別な/ソケットファイルをスキップする方法は?

次のコマンドを使用します。

rsync --archive --delete --partial --progress --recursive --no-links --no-devices --quiet source target

すでに--no-links--no-devicesを使用しています。

このようなエラーメッセージを取得します。

rsync: mknod "/mnt/shared/backup/var/spool/postfix/dev/log" failed: Operation not permitted (1)

rsyncをゼロ以外で終了させます。これは悪いです。バックアップスクリプトが壊れます。 (ディスク領域が残っていないなどの「正当な」理由でrsyncが失敗した場合に備えて、|| trueを使用してこのエラーを無視したくありません。)

この例では、それはソケットファイルです。この種の特別なファイルは気にしません。 rsyncにそれらを無視/スキップさせることはできますか?

5
adrelanos

rsync -a --no-specials --no-devicesは、これらのファイルをスキップするようにrsyncに指示します。それでも情報メッセージを出力しますが、他のエラーが発生しなければ0を返します。

転送したくない既知のパスのセットがある場合は、それらを完全に除外できます。また、-xオプションを渡して、マウントされているすべてのファイルシステム(最大の違反者を処理する/devを含む)をスキップし、ディスク上のファイルシステムが複数ある場合は、すべてのマウントポイントを一覧表示します(例: rsync -ax / /home /destination)。

rsync -ax --exclude='/var/spool/postfix/dev/*' / /mnt/shared/backup

それでも満足できない場合は、 スキップするファイルのリストを作成してください 。一部のファイル名が攻撃者の管理下にある場合、一部のファイルがバックアップから除外される可能性があることに注意してください。たとえば、名前が改行であるディレクトリを作成し、その中に*という名前のソケットを作成した場合、find -type sの出力を除外リストとして使用すると、/*は次のようになります。除外。このような問題を防ぐには、問題のある名前を除外リストに含めないでください。

{
  cd /path/to/source &&
  find . -name '*[\[?*
]*' -Prune -o \
               \( -type b -o -type c -o -type p -o -type s \) -print |
  sed 's/^\.//'
} | rsync -a --exclude-from=- /path/to/source /destination

rsyncfindと一緒に使用できますか?このようなもの:

find /your/source/dir -type s 1> /tmp/ignore-list
rsync <your options> --exclude-from=/tmp/ignore-list /your/source/dir/ /your/destination/dir/
1
Serge Roussak