Sudoは、ログインしたユーザー(実際にはSudoを実行したユーザー)を見つけるために使用できる環境変数「SUDO_USER」を作成します。
Sudoをルートにすると(Sudoを使用して他のユーザーにアクセスすることも可能です)、次の2つのステップを自動化するスクリプトを作成できます。
cp source target
chown $SUDO_USER target
(root以外のユーザーにsudoを実行すると、rootのみがファイルを配布できるため、これは機能しません。)
自動化には少し手間がかかります。ソースが単一のファイルで、ターゲットがディレクトリでない場合、作業は完了です。問題はより複雑な状況、たとえば次のような場合にのみ実際の問題であるため、あなたは質問をしたと思います:
cp /path/source/some*files /path/target/directory/
渡されるファイルとディレクトリ、既存のもの、上書きされるものを把握し、正常にコピーされたファイルのみの所有権を変更する複雑なスクリプト。
この作業はすでに完了しています。使用できますcpio
-rootにsudoした後、cpioを使用してファイルをコピーします。cpioはコピーするファイルのリストを必要とするため、2段階のプロセスです。以下ではls
、コピーするファイルのリストを生成するために使用します。
ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/
-pdm
「パススルーモード、必要に応じてディレクトリを作成、ファイル変更時間を維持」という意味
--owner $SUDO_USER"
指定されたユーザーがファイルを所有するようにします。
最後のオペランドは、cpioがファイルを保存する必要があるディレクトリです。
cpioの素晴らしさの詳細については、CPIOのマニュアルページをご覧ください。
単一のsudoコマンドでこれを行うことも可能です。ユーザーがファイルにアクセスする権限を持っていると仮定して、次のようにcpio部分にのみsudoを使用します。
ls /path/source/some*files | cpio -pdm --owner $USER /path/target/directory/
上記の場合、$ SUDO_USERの代わりに$ USERを使用しています。これは、Sudoが実行される前に評価されるためです。または、ユーザーがファイルを一覧表示するアクセス権を持っていない場合は、ラッパースクリプトに入れて、sudoを使用してラッパーを実行します。これは難しくなる可能性がありますが、最も単純なケースでは、ラッパーはソースとターゲットの2つの引数を取ります。
これは「cp_as_user」ラッパーに入ります。
ls $1 | cpio -pdm --owner $SUDO_USER $2
次に、次のようなラッパーを使用します。
sudo cp_as_user "/ path / to / some * files" / path / to / target / directory
sudo cat /etc/foo.txt > ~/foo.txt
。ファイルは何らかの理由でrootのみが読み取り可能になる傾向があるため、root以外のユーザーがコピーを読み取り可能にする場合は、その理由に留意してください。