我有 shell 脚本,我像这样运行
/var/www/test.sh 2015
或者
/var/www/test.sh 2014
当这个脚本运行时,它实际上从 freeradius 获取数据并在 www 文件夹中生成特定年份的 gnuplot 基本图,例如
/var/www/output.jpg
现在我想制作一个包含 2015 年、2014 年等年份的 php 下拉菜单,当用户选择任何年份时,它应该运行具有特定选择年份的脚本。但是我怎样才能将年份传递给 shell 脚本呢?
到目前为止我已经尝试过这个但它不起作用。
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、PHP 运行 chroot、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");
}
您的代码应该可以工作(尽管它非常不安全)。它不起作用的原因应该在您的日志文件中。