ルートが所有する「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」で実行するタスクを実行します。