シェルからの出力と権限のリダイレクト

シェルからの出力と権限のリダイレクト

権限について質問があります。

ディストリビューション: Debian GNU/Linux 6.0.4(圧縮)

したがって、PHPスクリプトを含むフォルダがあります。フォルダとファイルの両方がUser1の所有です。

私がこうすれば:

php script.php

権限拒否エラーが発生します。十分です。私はユーザー1ではなくユーザー2です。もし私がするなら

sudo php script.php

私のユーザーアカウントはこれに設定されているので動作します。

だから私は、「デバッグ」モードのようなものを出力するためにオプションのパラメータを受け入れるようにこのスクリプトを作成しました。

sudo php script.php debug

一部のコンテンツをCLIに出力します。今まではそんなに良くなった。

しかし、時にはスクリプトの出力が長すぎて上にスクロールして最初から出力を見ることができないので、出力をファイルにリダイレクトできるようにしたいです。

だから、次のことを試しました。

これにより権限拒否エラーが発生しました。

sudo php script.php debug >> results.txt

これは効果があります

sudo touch results.txt
sudo chown User1 results.txt
sudo chmod 777 results.txt
sudo php script.php debug >> results.txt

またはこれが機能します

sudo su -
php script.php debug >> results.txt

だから私が知りたいのは...最初の項目で権限拒否エラーが発生するのはなぜですか? sudo プレフィックスのポイントは、PHP スクリプトの実行に機能する root でコマンドを実行することです。しかし、これがリダイレクトの実行まで拡張されていないようです。誰かが理由を説明できますか?

編集する:

だから何かを見つけました。ここに別の投稿がありますこれは働きます:

sudo php script.php debug | sudo tee results.txt

それに対する答えは、リダイレクトがsudoの代わりに私のユーザーとして実行され続けているという疑いを確認しますが、理由は説明しません。理由を説明できる人はいますか?

答え1

コマンドラインで作業すると、シェルは最初にリダイレクトを実行し、次に外部コマンドを実行します。これは、ユーザー権限を変更せずにリダイレクトが行われることを意味します(シェルは後でsudoの実行を気にしないためです)。

簡単に実行できるsudoコマンドは、>> results.txtこれを確認せずに/ dev / stdoutに対して変更されたファイル記述子を取得します。

2つの可能性:

  1. あなた(user2)が書き込むことができるファイル/ディレクトリにリダイレクトされます。
  2. これを行うには、ラッパースクリプトを作成し、sudoを介してラッパースクリプトを呼び出します。

関連情報