PHPを介してシェルスクリプトを実行しようとしたときに権限エラーが発生しますが、www-dataユーザーにパスワードなしでsudoコマンドを使用する権限を追加しようとしましたが、うまくいきません。私が間違って報告したのかわかりません。私の「visudo」ファイルを編集する方法は次のとおりです。
www-data ALL=(ALL) NOPASSWD:/var/www/mysite/classes/builder-sites-nginx.sh
www-data ALL=(ALL) NOPASSWD:/var/www/mysite/classes/MyClassToCallScript.php
私のPHPコードは次のとおりです
$command = "sudo sh ".dirname(__FILE__)."/builder-sites-nginx.sh {$domain}";
// dump($command);
$response = shell_exec($command);
私のコードシェル:
#!/bin/bash
FILE_FROM=/etc/nginx/sites-available/sites-builders
FILE_TO=/etc/nginx/sites-enabled/"$1"
[ ! -d "$FILE_FROM" ] && mkdir -p "$FILE_FROM"
if test -f "$FILE_TO"; then
echo "syntax is ok. $FILE_TO already exists"
else
ln -s "$FILE_FROM/$1" /etc/nginx/sites-enabled/
#check stats
if nginx -t > /dev/null 2>&1; then
echo "syntax is ok"
service nginx reload
else
echo "syntax is not ok"
rm "$FILE_TO"
fi
fi
しかし、私の答えは「空です」です。私は「visudo」に次の抜粋を追加してこれをテストしました。
www-data ALL=(ALL) NOPASSWD:ALL
上記のアプローチを使用すると効果がありますが、私のサイトのセキュリティが損なわれると思います。そうですか?私のApacheユーザーにsudo権限があるのはなぜですか?誰かが悪意のあるファイルを置くと問題が発生する可能性があるため、元の質問に戻ります。与えられたスクリプトを実行するときに「visudo」パスを正しく配置する方法ですか?
答え1
実行していません。sudo /var/www/mysite/classes/builder-sites-nginx.sh
実行中であり、www-dataの実行を許可するように設定されていません(これを行うことはできません。これは巨大なセキュリティホールになります。これに相当します)。sudo sh /var/www/mysite/classes/builder-sites-nginx.sh
sudo
sudo sh
www-data ALL=(ALL) NOPASSWD:ALL
/var/www/mysite/classes/builder-sites-nginx.sh
make実行可能ファイルを使用し、これが最初の行であることをchmod +x
確認してください(スクリプトはbash専用の機能を使用していないため動作します)。#!/bin/bash
#!/bin/sh
次に、PHPコードを次のように変更します。
$command = "sudo ".dirname(__FILE__)."/builder-sites-nginx.sh {$domain}";
ただし、定義された場所と方法によっては$domain
(たとえば、ユーザー提供のデータからのものなど)、PHPescapeshellcmd()
機能を使用してクリーンアップする必要があるかもしれません。