シナリオ:一般ユーザーが実行するスクリプトを使用して複数のファイルをコピーし、dir構造をコピーしたいと思います。たとえば、
cp --parents /lib/libacl.so /tmp/my_root/
cp --parents /lib/libc.so.6 /tmp/my_root/
予想される結果:まずcp
/tmp/my_root/libを作成し、ここにlibacl.soを置きます。 2番目はcp
libc.so.6を/tmp/my_root/libに入れます。
問題は、最初のものはcp
権限を使用して/tmp/my_root/libを生成するため、dr-xr-xr-x.
2番目はcp
権限が拒否されて失敗することです。
もちろん、rootでスクリプトを実行すると、すべてがうまく機能します。
1つの回避策は、まずディレクトリを作成してからファイルをコピーして、そのディレクトリに適切な権限を付与することです。しかし、これを行うより良い方法があるかどうか疑問に思います。たぶんいくつかのフラグがありますかcp
?その人を確認しましたが、何も見つかりませんでした。
答え1
解決策は見えませんcp
。同じ種類のコピーを実行するために使用できrsync
、書き込めないディレクトリも作成されますが、lib
新しいファイルを追加できます。あなたのコマンドは次のとおりです
rsync -LR /lib/libacl.so /tmp/my_root/
rsync -LR /lib/libc.so.6 /tmp/my_root/
-R
ディレクトリ構造を維持します。シンボリックリンクを追加しましたが、-L
それが多いようですcp
。一般的に私たちが望むものではありませんが。-a
権限とタイムスタンプ(ルートの場合は所有者/グループ)を保存するために追加できます。
rsync は通常、ネットワーク経由でファイルをコピーするために使用されますが、非常に一般的なコマンドです。
rsyncがない場合は、別のコマンドを使用してファイルをコピーできますが、書き込み可能ディレクトリ、例、tar
およびcpio
:
tar cf - /lib/libc.so.6 | tar -C /tmp/my_root/ -xf -
または、chf
トレースリンクを使用します。 CPIOの場合:
ls /lib/libc.so.6 | cpio -pd /tmp/my_root/
リンクをたどるには-Lを使用してください。