このように実行するシェルスクリプトがあります
/var/www/test.sh 2015
または
/var/www/test.sh 2014
このスクリプトが実行されると、実際にfreeradiusからデータを取得し、wwwフォルダの特定の年のgnuplotデフォルトプロットを生成します。
/var/www/output.jpg
それでは、2015年、2014年などを含むPHPドロップダウンメニューを作成したいと思います。ユーザーが年を選択した場合は、選択した特定の年でスクリプトを実行する必要があります。しかし、どのように年をシェルスクリプトに渡すことができますか?
これまでこれを試しましたが、うまくいきません。
root@rm:/var/www# cat test5.php
<html>
<head><title>some title</title></head>
<body>
<form method="post" action="">
<input type="text" name="something" value="<?= isset($_POST['something']) ? htmlspecialchars($_POST['something']) : '' ?>" />
<input type="submit" name="submit" />
</form>
<?php
if(isset($_POST['submit'])) {
echo ($_POST['something']);
// Now the script should be executed with the selected year
$message=shell_exec("/var/www/test.sh $something");
// and after executing the script, this page should also open the output.jpg in the browser
}
?>
</body>
<html>
root@rm:/var/www#
答え1
HTMLのドロップダウンメニューはオプションです。
<form method="post" action="">
<select name="something">
<option value="2014">year 2014</option>
<option value="2015">year 2015</option>
</select>
<input type="submit" name="submit" />
</form>
それから提出後
$something = $_POST["something"];
shell_exec("/var/www/test.sh $something");
答え2
PHPがコマンドを実行できるようにするのは危険です。 SELinux、Apparmor、chrootを実行するPHP、セーフモードで実行されているPHP、PHPで無効にされた機能など、目標の達成を妨げる可能性がある多くのものがあります。
コードを確認するにはただあなたが望むことをするためにあなたが必要とするもの入力検証
// Since value appears to be a numeric year, lets insist that its a number
$arg=(integer)$_POST['something'];
// in an appropriate range
if ((1970<$arg) && (3000>$arg)) {
// this part is redundant given the checks above but included for completeness
$arg=escapeshellarg($arg);
$message=shell_exec("/var/www/test.sh $something");
}
あなたのコードはうまくいくでしょう(それほど安全ではありませんが)。うまくいかない理由はログファイルになければなりません。