PHPファイルを実行すると、ルートのみがアクセスできるファイルに文字列を書き込みます。

PHPファイルを実行すると、ルートのみがアクセスできるファイルに文字列を書き込みます。

ファイルにいくつかの文字列を作成する必要があるかもしれませんが、これだけを行うことができますroot。私はこれに基づいていくつかの解決策を試しています。郵便はがきしかし、それらのどれも動作しません。

ケース: ユーザーが正常に完了すると、writefile.phpアクセス専用権限()で書き込むことができるファイルを含むスクリプトに自動的にアクセスできます。tes.txtroot

私はvisudoこれを使用し、私のsudoersファイルに追加します。

username ALL=(root) NOPASSWD: /var/www/html/myprogram/writefile.php いいえ!

username ALL=(ALL) NOPASSWD: /var/www/html/myprogram/writefile.php いいえ!

私の簡単なコード存在するwritefile.php

<?php
echo file_put_contents("tes.txt","Hello World. Testing!");
?>

結果:

Warning: file_put_contents(tes.txt): failed to open stream: Permission denied

答え1

多くの試みの末に関連記事も読んでみました。最後に、私は問題が私の合意にあることに気づきました。これがsudonを初めて使用する他のユーザーに役立つことを願っていますvisudo

質問:

1. ユーザー名

に関しては、username私が追加したユーザーは、端末を介したログイン権限を持つユーザーです。ウェブサイトを介してアプリケーションにアクセスしても同様です。したがって、ユーザーはwww-data次のようになります。

www-data ALL=(root) NOPASSWD: /usr/bin/php /var/www/html/myprogram/writefile.php

2. execやshell_execを使用しないでください

writefile.phpブラウザから直接アクセスしてはいけないという事実を忘れてしまいました。コマンドは別のファイル()を介して渡されindex.php、その後そのファイル内でshell_execまたはを使用してコマンドをexec実行する必要があります。構造は次のとおりです。writefile.phpsudo

index.php

<?php
exec("sudo /usr/bin/php /var/www/html/myprogram/writefile.php");
?>

file.phpを書く

<?php
echo file_put_contents("tes.txt","tes write file");
?>

いよいよ開封tes.txtしてうまく動作します!みんなありがとうございます。

答え2

これはsudoの仕組みについての誤解のようです。 sudoersファイルに何かを入れるだけでは、ファイルの権限は実際には変更されません。ファイルは次のように実行する必要があります: "ユーザー名"でsudo php /var/www/html/myprogram/writefile.php.. また、次のこともできます。設定によっては、その場所でファイルを実行することができない可能性があるため、SELinuxに問題が発生します。

関連情報