sudoでスクリプトを実行する方法については、次の2つの説明があります。
- sudoコマンドを実行するユーザーには、ファイルに対する実行権限も必要です。
- ファイル内のコマンド以外のファイルのみがrootとして実行されます。
私が聞いていることを疑う理由はありませんが、次の設定が実行されていて、上記の2つの文が正しい場合は、その理由を知りたいと思います。
次のスクリプトがあります。
/var/www/bash_scripts/test/set_permissions.sh
スクリプトには以下が含まれます。
chown -R jason:www-data /var/www/test.site.com
find /var/www/test.site.com -type f -exec chmod 664 {} \;
find /var/www/test.site.com -type d -exec chmod 775 {} \;
このスクリプトの権限は次のとおりです。
-rwxrwxr-- 1 root root 200 Nov 21 22:49 set_permissions.sh
私の/etc/sudoers
ファイルには、下部に次の行が追加されています。
www-data ALL=(ALL) NOPASSWD: /var/www/bash_scripts/test/set_permissions.sh
user で実行される PHP プロセスでスクリプトを実行すると、www-data
スクリプトが期待どおりに実行され、その中のすべてのコマンドが実行されます。
上記のステートメント1.が正しい場合、このスクリプトはrootユーザーのみが実行できるため、絶対に実行しないでください。上記のステートメント2が正しい場合、スクリプトのコマンドは実行されません。
私はこの2つの声明が正しいかどうかを理解しようとしています。それでは、上記の動作を引き起こすために何をしましたか?
編集する
www-data
持つ/var/www/test.site.com
PHPコードは次のようにコマンドを実行します。
exec('sudo /var/www/bash_scripts/site/test/set_permissions.sh 2>&1')
ベストアンサー1
- sudoコマンドを実行するユーザーには、ファイルに対する実行権限も必要です。
ステートメント1が正しくありません。 sudo を実行するユーザーには、スクリプトに対する実行権限は必要ありません。
- ファイル内のコマンド以外のファイルのみがrootとして実行されます。
ステートメント2も不正確です。 sudo ユーザーが呼び出すスクリプトのすべてのコマンドは、sudo ユーザーとして実行されます。
以下は、スクリプト/コマンドが実行されたユーザーIDを表示するために実行した単純なテストスクリプトです。
/tmp $ id
uid=1000(danesh) gid=1000(danesh)
/tmp $ ls -l test.sh
-rwxr-xr-x 1 danesh danesh 24 Nov 22 10:48 test.sh*
/tmp $ ./test.sh
uid=1000(danesh) gid=1000(danesh)
/tmp $ sudo ./test.sh
[sudo] password for danesh:
uid=0(root) gid=0(root) groups=0(root)
/tmp $ sudo chown root:root test.sh
/tmp $ sudo chmod 770 test.sh
/tmp $ ls -l test.sh
-rwxrwx--- 1 root root 24 Nov 22 10:48 test.sh*
/tmp $ ./test.sh
fish: The file “./test.sh” is not executable by this user
/tmp [126] $ sudo ./test.sh
uid=0(root) gid=0(root) groups=0(root)
/tmp $ cat test.sh
#!/usr/bin/env bash
# show the user executing this script
id
お役に立てば幸いです。