sudo cp /etc/foo.txt ~/foo.txt
これにより、新しいファイルが所有者として作成されます。root
ls
最後の2つのコマンドを使用する以外に、この問題を解決する方法はありません(ユースケースを明確にするため)。
belmin@server1$ ls /etc/foo.txt
> -rw------- 1 root root 3848 Mar 6 20:35 /etc/foo.txt
>
belmin@server1$ sudo cp /etc/foo.txt ~/foo.txt
belmin@server1$ sudo chown belmin: $_
私が好む:
- 1つのコマンドで実行してください
sudo
。 - 現在のユーザーを指定する必要なく(おそらく変数を使用していますか?)
答え1
install
代わりに使用してくださいcp
:
sudo install -o belmin /etc/foo.txt ~/foo.txt
答え2
とPOSIX互換cp
あなたはsudo cp -p foo bar
できます次のファイルメタデータを保存します。コピーするとき:
- 面接時間
- 時間の変更
- ユーザーID
- グループ番号
- モデル
設定したい場合その他ユーザーJenny Dのソリューションそれが一番です。
答え3
これにより:
sudo cat /etc/foo.txt > ~/foo.txt
その後、シェルによって次のように~/foo.txt
開きます。あなた(あなたの資格情報で生成されます)sudo
これにより、標準出力がその場所にリダイレクトされます。
結局のところ、ファイルはあなたのものになります。
このアプローチは制限にも役立ちますroot
。これはroot
その権限でのみ開かれ、/etc/foo.txt
潜在的に有害な作業は行いません(~/foo.txt
たとえば、シンボリックリンクの場合、書き込み用にファイルを開くと望ましくない結果が生じる可能性があります)。
答え4
Sudoは、ログインしたユーザー(実際にSudoを実行しているユーザー)を見つけるために使用できる環境変数「SUDO_USER」を生成します。
rootとしてsudoを使用していると仮定すると(他のユーザーにもsudoを使用できます)、次の2つの手順を自動化するスクリプトを作成できます。
cp source target
chown $SUDO_USER target
(rootユーザーのみがファイルを漏洩できるため、root以外のユーザーとしてsudoを使用している場合は機能しません。)
自動化には少し作業が必要です。ソースが単一のファイルで、宛先がディレクトリでない場合、操作は完了です。この問題は、実際には次のようなより複雑な状況でのみ問題になるため、この質問をしたとします。
cp /path/source/some*files /path/target/directory/
どのファイルとディレクトリが渡されたか、どのファイルとディレクトリが既存にあったか、どのファイルが実際に上書きされたかを確認し、正常にコピーされたファイルの所有権のみを変更する複雑なスクリプトです。
作業が完了しました。 - sudoを使用cpio
してrootに移動し、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が実行される前に評価されるため、$ SUDO_USERの代わりに$ USERを使用しています。または、ユーザーにファイルを一覧表示する権限がない場合は、そのファイルをラッパースクリプトに配置し、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