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

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終了をゼロ以外にしてください。これは良くありません。バックアップスクリプトが破損しています。 (私は|| true「正当な」理由で(例えば、残りのディスク領域がない)rsyncが失敗した場合、このエラーを無視したくありません。)

この例ではソケットファイルです。私はこの特定のファイルに興味がありません。 rsyncにこれを無視するかスキップするように指示できますか?

答え1

rsync -a --no-specials --no-devicesrsyncにこのファイルをスキップするように指示します。それでも情報メッセージを出力しますが、他のエラーが発生しない場合は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

答え2

たぶんあなたはrsyncそれを使用できますかfind?このような:

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

関連情報