私は、WebサブミットによってトリガーされるPHPプログラムを作成しようとしていますが、単一のコマンドラインパラメーターで実行するようbashスクリプトに指示しています。私はbashのshflagsコマンドラインパーサーを使用しています。次のようにshflagsを使用するbashスクリプトにPHP変数を渡します。
// generate unique filename
$destinationFolder = Mage::getBaseDir('media') . DS . 'webforms' . DS . 'xml';
$filename = $destinationFolder . DS . $result->getId().'.xml';
// create folder
if (!(@is_dir($destinationFolder) || @mkdir($destinationFolder, 0777, true))) {
throw new Exception("Unable to create directory '{$destinationFolder}'.");
}
// export to file
$xmlObject->getNode()->asNiceXml($filename);
// define parameters to pass
exec ('/opt/bitnami/apache2/htdocs/sfb/scripts/xform.sh --xmlfile'.' '.$filename);
}
}
?>
bashスクリプト(xform.sh)(単にテストスクリプト)は以下のよう
PHPスクリプトの適切な部分です。
#!/bin/bash
. ./shflags
echo "foo" >> /opt/bitnami/apache2/htdocs/sfb/scripts/seeds/xform/$$".txt"
echo "foo" >> /opt/bitnami/apache2/htdocs/sfb/scripts/seeds/xform/foo.txt
DEFINE_string 'xmlfilename' 'test' 'filename of current x.xml file from webforms' 'Z'
FLAGS "[email protected]" || exit 1
eval set -- "${FLAGS_argv}"
echo "xml file was" ${FLAGS_xmlfilename} >> /opt/bitnami/apache2/htdocs/sfb/scripts/seeds/xform/foo.txt
bashスクリプトは、コマンドラインから正常に動作する、すなわち
$xform.sh --xmlfilename 1.xml
foo.txtのファイルに "xmlファイルが1.xmlだった" 書いています。
WebからPHPスクリプトが起動されると、最初の部分は正常に動作します。つまり、foo.txtと$$。txtの2つのターゲットファイルに "foo"が書き込まれます。しかし、xmlfilename変数は出てこないので、コマンドラインに渡すファイル名が本当に必要です! (ファイル名はユーザの入力ではなく、PHPプログラムによって生成されるため、escapeshellargを使う必要はありません。)
私が考えることができるすべてのファイルパーミッションをチェックしました。 xform.shとshflagsは両方とも、Apacheが所有するwww-データ(Apache)グループのメンバーであり、+ xです。
私の疑問は、問題がa)私のPHP exec構文か、b)ファイルのアクセス権のいずれかに関係しているという疑いがあります。この行のxform.shの後のビットを除いて、すべてが意図したとおりに動作します!
exec ('/opt/bitnami/apache2/htdocs/sfb/scripts/xform.sh --xmlfile'.' '.$filename);
UPDATE:私はいくつかのテストコードの問題を単離することによって、いくつかのより多くの問題を狭めてきた
。 :
$script="echo";
$xmlfilename="$filename";
$target=">> /opt/bitnami/apache2/htdocs/sfb/scripts/seeds/xform/foo.txt";
exec ("$script $xmlfilename $target");
...
PHPは正しく値が "エコー" で、$ファイル名があまりにも働くときに$スクリプトの動作、foo.txtのために$ファイル名を書き込みます。
$ scriptを、ファイルにデータを書き込むxformスクリプトの別の単純な形式に設定すると、それも正しく動作します。
この問題は、特に、PHPが$ filenameをコマンドライン変数として書き込もうとしたときに発生します。 Apacheが実行するスクリプトには、コマンドライン変数が含まれていると、通常より多くの権限が必要ですか?
Sigh。あなたのexec()
コールで
チェックとして、コマンドラインからそれを呼び出しています。あなたがexec()呼び出しの中でそれを使用しているからです。 exec()呼び出しの上に正しく構築されていない場合、execは--- xmlfileのための "空の"パラメータを入力します。 –
私はもう少し問題を絞り込んだ。 –
Apacheは、コマンドラインで使用するアクセス権とは異なるアクセス権を持っています(ユーザーIDでなくwww-dataなどで実行されます)。Apacheから起動されるシェルは、通常のシェルプロンプトとは異なる環境を持っています。 –