次のような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
をコメントアウトしました。
私は間違っているかもしれませんが、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 *
誰かが私の理解を確認または反論できる場合は、それを高く評価します
次の設定を使用できます
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を特定のユーザーで実行できます。