이렇게 실행하는 쉘 스크립트가 있습니다
/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");
}
귀하의 코드는 작동할 것입니다(비록 매우 안전하지는 않지만). 작동하지 않는 이유는 로그 파일에 있어야 합니다.