ファイルのコピーまたは同期時の所有権の設定

ファイルのコピーまたは同期時の所有権の設定

ルートにファイルを移動またはコピーするときに、ファイルを移動したいディレクトリの所有者に基づいてファイルの所有権を設定したいことがよくあります。

コピーされたすべてのファイルのrsync出力を解析し、各ファイルを削除するスクリプトの作成を開始する前に、これを行うより良い/既存の方法はありますか?

tmp/ftp/new-assests/たとえば、元のフォルダがuser_www所有の場所にフォルダをコピー/移動/同期する必要があり、ターゲットファイルとそのファイルを含む~user1/tmp/フォルダと他のフォルダを~user2/html-stuff/それぞれターゲットに所有させたいとします。ディレクトリに既存のファイルがあります。user1user2

はい、ユーザーにフォルダに対する読み取り権限がある場合はファイル自体をコピーできますが、この場合は関係ありません。これらがnologinユーザーであり、ソースファイルへのアクセス権がないとしましょう(助けになる場合)。

答え1

使用rsync:

rsync -ai --chown=user1 tmp/ftp/new-assests/ ~user1/tmp/

user1許可されている場合は、ディレクトリを指定された場所にコピーし、ファイルの所有権を 。

パラメータの一般的な形式--chownはありますが、上記のように特定のユーザーを所有者に設定したり、特定のグループを設定したりすることもできUSER:GROUPます(ユーザーIDを省略した場合、パラメータはオプションではありません)。USER:GROUP:

答え2

では、zshいつでも次のことができますroot

(cd tmp/ftp && tar cf - new-assests/) \
   > >(USERNAME=user1; cd ~user1/tmp && tar xopf -) \
   > >(USERNAME=user2; cd ~user2/html-stuff && tar xopf -)

zshこれは2つの特定の機能を利用します。

  • この設定は、$USERNAMEシェルプロセスEUID、UID、GID、EGID、および補足gidをユーザーデータベースに基づくユーザーのEUIDに変更します(ユーザーがそのユーザー名でログインしたかのように)。ユーザーがデータベースにない場合は自動的に無視されますが、USERNAME=username失敗しcd ~username、サブシェルが終了します。
  • 出力のためにfdを複数回リダイレクトすると(ここではstdout、2つの異なるプロセスで)、同様の動作がトリガされ、出力を2つの宛先にtee送信します(mult_iosこのオプションで有効、デフォルトでは有効)。これにより、ソースコードを2回読み取る時間が節約されます。

解凍tarプロセスが終了すると、パイプライン全体が中断される可能性があります。

kshまたは、bashユーザー変更機能はありませんが、代わりに(使用可能な場合)またはsu機能を使用して交換することもできます。sudoteemultios

(cd tmp/ftp && tar cf - new-assests/) |
  tee >(cd ~user1/tmp && sudo -u user1 tar xopf -) |
  (cd ~user2/html-stuff && sudo -u user2 tar xopf -)

これは、ターゲットユーザーがターゲットディレクトリへの書き込み権限を持っていると仮定します。

一部の実装には、アーカイブに保存されているファイルのユーザー名とグループ名を上書きする/または/オプションがtarあります。したがって、別のオプションは、次のようなことを行うことです。--owner--group-chown-chgrp

(cd tmp/foo && tar --owner=user1 --group="$(id -g user1)" -cf - new-assets) |
  (cd ~user1/tmp && tar xpf -)

そして繰り返してくださいuser2

すべての場合に適用できる一貫したソリューションはないので、そのような場合にファイルにACLがある場合はどうすればよいかを検討できます。

関連情報