sudo リダイレクト権限が拒否されました。

sudo リダイレクト権限が拒否されました。

ルートが所有する「s」というファイルがあります。 sudoを使って内容を別のものに置き換えたいのですが失敗します。 "sudo ls -l > s" 権限が拒否されました。しかし、sudo suの後に同じことをすると、すべてがうまくいきます。

私のsudoコマンドが失敗する理由を知りたいです。 ">"ジョブではなくroot権限でlsだけが実行されたようで失敗しました。それではどうやってsudoをしますか?

背景:スクリプトでこれを使用したいので、sudo suは使用できません。

ちなみに私が試したことは次のとおりです。

xropi@xropi-VirtualBox2:~/w$ ls -l
total 4
-rw-r--r-- 1 root root 18 Dec 25 01:33 s

xropi@xropi-VirtualBox2:~/w$ cat s
asdf
sadf
dsf
sdf

xropi@xropi-VirtualBox2:~/w$ sudo ls -l > s
bash: s: Permission denied

しかし、sudo suを使用すると、すべてがうまく動作します。

xropi@xropi-VirtualBox2:~/w$ sudo su

root@xropi-VirtualBox2:/home/xropi/w# ls -l > s

root@xropi-VirtualBox2:/home/xropi/w# cat s
total 0
-rw-r--r-- 1 root root 0 Dez 25 01:34 s

root@xropi-VirtualBox2:/home/xropi/w#

答え1

出力リダイレクトは、sudo が実行するプロセスではなくシェルで評価されます。シェルはコマンドを実行する前にリダイレクト(>)のようなものを解釈するので、sudoはユーザーがファイルにリダイレクトしていることを知らず、シェルはttyの代わりにコマンドのstdoutファイルハンドルをファイルに追加します。

シェルはあなたのアカウントで実行されているので、あなたのアカウントにファイルを書き込もうとするので失敗します。

ファイルにrootとして書き込むには、次のtee例のように次のようなものを使用します。

ls -l | sudo tee s

これにより、リダイレクトするのではなく、出力がコマンドにパイプls -lされ、sudoからrootとして実行されます。tee

シェルリダイレクトを使用するには、次の手順を実行する必要があります。

sudo sh -c ‘ls -l > s’

これは root としてシェルを実行し、デフォルトでライナーのように「sudo su」で実行するタスクを実行します。

関連情報