web-dev-qa-db-ja.com

PHPで特定のbashスクリプトをroot権限で実行できるようにする

次のようなbashスクリプトを呼び出すphpスクリプトがあります。

<?php
    $result = exec('Sudo /bin/bash /var/www/my_bash_script.sh /var/www/vhosts/testsite/htdocs/');
    var_dump($result);
?>

これはmy_bash_script.shの内容です:

#!/bin/bash
svn export --force --no-auth-cache --username myusername --password mypassword http://1.2.3.4/repos/path/to/repo/ $1 2>&1
find $1 -print0 -type d | xargs -0 -n 1 -0 chown -R -v root:root 2>&1
find $1'storage' -print0 -type d | xargs -0 -n 1 chown -R -v Apache 2>&1
find $1'shared' -print0 -type d | xargs -0 -n 1 chown -R -v Apache 2>&1

スクリプトの目的は、私のsvnリポジトリからエクスポートを実行し、ユーザー権限を正しく設定することです。

PHPはApacheユーザーとして実行されます。

PHPこのスクリプトを実行する権限を付与するために、次の行をsudoersに追加しました:

Apache ALL=(ALL) NOPASSWD:ALL

これで明らかにこれはPHPパワーが大きすぎるので、PHPを制限してこの特定のbashスクリプトを実行するだけですが、取得できないようです。構文権:

Apache ALL=(ALL) NOPASSWD:/var/www/my_bash_script.sh

上記は空の文字列を($result PHP変数に)返すだけです-何が間違っていますか?

ありがとう!

編集:-sudoersで#Defaults requirettyをコメントアウトしました。

4
bbeckford

私は間違っているかもしれませんが、sudoersはコマンド自体だけでなく、コマンド/スクリプトに渡すことができるパラメーターも制限していると思います。

パラメータなしで.shを実行しようとすると、おそらく動作します。

  Sudo /bin/bash /var/www/my_bash_script.sh

そのため、sudoersにそのスクリプトを任意のパラメーターで(Apacheで)実行できるようにするには、次のように行を調整する必要があります。

  Apache ALL=(ALL) NOPASSWD:/var/www/my_bash_script.sh *

ワイルドカードを使用すると、Apacheは任意のパラメーターでそのスクリプトを実行できます。

その行に/ bin/bashも必要になるかもしれませんが、私にはわかりません

  Apache ALL=(ALL) NOPASSWD: /bin/bash /var/www/my_bash_script.sh *

誰かが私の理解を確認または反論できる場合は、それを高く評価します

6
Hadz

次の設定を使用できます

Cmnd_Alias SVNUP = /root/webhooks/svn_update.sh
Apache ALL=(ALL) NOPASSWD: SVNUP

簡単なテストスクリプトを作成する

# cat test.sh
#!/bin/bash

set -u
echo "Param1: $1"

簡単なテストを行う

$ id alex
uid=506(alex) gid=506(alex) groups=506(alex)

$ cat /root/webhooks/test.sh
cat: /root/webhooks/test.sh: Permission denied

$ Sudo /root/webhooks/test.sh val1
Param1: val1

$ Sudo /root/webhooks/test.sh
/root/webhooks/test.sh: line 5: $1: unbound variable

ただし、変数の展開のため、たとえば、.

$ Sudo /root/webhooks/test.sh "$(rm -fr ~/*)"

追伸別の方法として、Apacheでmpm-itkを使用して、この特定のvhostsを特定のユーザーで実行できます。

0
ALex_hha