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


19

を実行するsudo cp /etc/foo.txt ~/foo.txtと、新しいファイルがroot所有者として作成されます。

現時点では、最後の2つのコマンドを使用する以外、これを回避する方法はありません(lsユースケースを明確にするため)。

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. 現在のユーザーを指定する必要はありません(変数を使用している可能性があります)。

sudo cat /etc/foo.txt > ~/foo.txt。ファイルは何らかの理由でrootのみが読み取り可能になる傾向があるため、root以外のユーザーがコピーを読み取り可能にする場合は、その理由に留意してください。
jw013 14

回答:



14

POSIX互換cpのことができますsudo cp -p foo barする次のファイルのメタデータを保存するコピーするとき:

  • アクセス時間
  • 変更時間
  • ユーザーID
  • グループID
  • モード

別のユーザーを設定する場合は、JennyDのソリューションが最適です。


2
これは、元のファイルがターゲットユーザーによって所有されている場合にのみ機能します。
ジェニーD 14

4
sudoを実行している人は元のファイルを所有していないと思います。そうでなければ、sudoを使用する必要はありません。
EightBitTony 14

@EightBitTony所有していないsudoファイルをコピーする必要はありません。結局のところ、読み取りアクセス権が必要です。
l0b0 14

はい、私の側のミスタイプ-しかし、私は彼らがまだsudoを必要としないので、問題のユーザーIDもファイルを読むことができないと思います。したがって、最終ファイルを所有することを目的としたユーザーIDには、元のファイルへのアクセス権がないと想定する必要があります。いずれにしても、これはsudoの「問題」ではありません。あなたの答えは、私たちが望まないと思わなければならない所有者を保存することを示唆しています。
EightBitTony 14

2
理論的には、ファイルはターゲットユーザーが所有しているが、ターゲットユーザーが入力する権限を持っていないディレクトリにある可能性があります。しかし、それは非常に可能性が低いです:-)
ジェニーD 14

8

もしあなたがそうするなら:

sudo cat /etc/foo.txt > ~/foo.txt

次に~/foo.txtとしてシェルによって開放されるあなた(そう、あなたの資格情報を使用して作成された)、その後、sudoそれにリダイレクトされ、その標準出力に実行されます。

最終的に、ファイルはあなたが所有します。

その種のアプローチはまたによって行われることを制限するのを助けますroot。ここでrootは、彼の権限を使用してopenのみを/etc/foo.txt実行します。潜在的に有害なことは行いません(書き込み用にファイルを開きます~/foo.txt。たとえば、シンボリックリンクの場合、悪い結果を招く可能性があります)。


2
これは、ユーザーがターゲットディレクトリに書き込みできることを前提としています。
ヨハン14

3

を使用してsudo、別のユーザーに切り替えます。これがコマンドの要点です。最初のファイルには通常のアクセス権がないため、アクセスするには別のユーザー(rootこの場合)である必要があります。

sudoすべてsudoを行っているのは、コマンドを実行するために他のユーザーに切り替えるだけなので、それを管理する方法はありません。

あなたがする必要があります

  1. 2つのコマンド(または1つの複合コマンド)を使用し続ける
  2. 別のコマンドを見つける(インストールなど、別の回答に表示)
  3. または、スクリプトを記述して、そのスクリプトを実行しますsudo

1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.