このbashスクリプトをsudoとして実行してコンテンツをrootとして実行する方法

このbashスクリプトをsudoとして実行してコンテンツをrootとして実行する方法

sudoでスクリプトを実行する方法については、次の2つの説明があります。

  1. sudoコマンドを実行するユーザーには、ファイルに対する実行権限も必要です。
  2. ファイル内のコマンド以外のファイルのみが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

  1. sudoコマンドを実行するユーザーには、ファイルに対する実行権限も必要です。

ステートメント1が正しくありません。 sudo を実行するユーザーには、スクリプトに対する実行権限は必要ありません。

  1. ファイル内のコマンド以外のファイルのみが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

お役に立てば幸いです。

おすすめ記事