sudoコマンドを使用してファイルを生成した場合、ファイル所有者は誰ですか?

sudoコマンドを使用してファイルを生成した場合、ファイル所有者は誰ですか?

私のユーザー名を使用してログインしますravbholua

ravbholua@ravbholua-Aspire-5315:~$ echo $LOGNAME ravbholua

私が作成したファイル名は次のとおりですa1

ravbholua@ravbholua-Aspire-5315:~$ echo>a1
ravbholua@ravbholua-Aspire-5315:~$ ll a1
-rw-rw-r-- 1 ravbholua ravbholua 1 Oct  8 09:57 a1

やはりravbholua上記のファイルの所有者は私()です。

echo次に、sudoと次のコマンドを使用してa2を作成します。

ravbholua@ravbholua-Aspire-5315:~$ sudo echo>a2
ravbholua@ravbholua-Aspire-5315:~$ ll a2
-rw-rw-r-- 1 ravbholua ravbholua 1 Oct  8 09:57 a2

所有者はまさに私、つまりravbholua

ここで sudo を再利用して a3 を生成しますが、vim次のコマンドを使用します。

ravbholua@ravbholua-Aspire-5315:~$ sudo vim a3
ravbholua@ravbholua-Aspire-5315:~$ ll a3
-rw-r--r-- 1 root root 10 Oct  8 09:57 a3

ああ!今はなぜ所有者が変わったのですか?私ではなくルートです。なぜそのようなecho変化が生じたのですかvim!驚くべきことに変更コマンド生成されたファイルの所有者を変更する方法

答え1

2番目の例echoはで実行されsudoますが、リダイレクト元のシェルで発生します。

sudo bash -c "echo > a4"

答え2

sudoただ命令です。

最初の例は次のとおりです。 sudo echo>a2

sudoそれは命令です。リダイレクトはエコーと矛盾しますが、何の意味もありません。

たとえば、 echo cat /etc/passwd > /tmp/foo /tmp/fooから/etc/passwdの内容を取得できません。あなたはそれを持つでしょうcat /etc/passwd。 sudoも例外ではありません。 echo部分はsudoのパラメータにすぎません。 sudoはそれを使って何かをしますが、シェルはそれを知りません。

これはsudoアクセスがrootアクセスと非常に異なる点の1つです。

sudo vim a3たとえば、vim a3sudoを使用してrootとして実行します。そしてvimはrootとして実行されるので、ファイルはrootが所有します。

関連情報