私のユーザー名をrootの代わりに生成されたファイルの所有者に設定するようにsudoに指示する方法はありますか?

私のユーザー名をrootの代わりに生成されたファイルの所有者に設定するようにsudoに指示する方法はありますか?

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. 1つのコマンドで実行してくださいsudo
  2. 現在のユーザーを指定する必要なく(おそらく変数を使用していますか?)

答え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

関連情報