带有exec和sed命令的php表单
我试图创建一个php表单来更改vps上文件中的值。以下是我正在尝试的代码:带有exec和sed命令的php表单,php,forms,sed,exec,Php,Forms,Sed,Exec,我试图创建一个php表单来更改vps上文件中的值。以下是我正在尝试的代码: <?php echo "<form "; $type = (int)$_POST['animal_type']; echo exec("sed -i 's/animal=*/animal=$type/g' /home/user1234/animals/file.props"); echo "method='post'>"; echo
<?php
echo "<form ";
$type = (int)$_POST['animal_type'];
echo exec("sed -i 's/animal=*/animal=$type/g' /home/user1234/animals/file.props");
echo "method='post'>";
echo '<select name="animal_type" onChange="this.form.submit()">';
echo '<option value="bat">bat</option>';
echo '<option value="fish">fish</option>';
echo '<option value="cat">cat</option>';
echo '<option value="dog">dog</option>';
echo '</select>';
echo '</form>';
?>
表单的期望指定URI。相反,有一个函数返回字符串。我假设这个字符串不是有效的URI。因此,在html的源代码中,它将如下所示:
<form action=some string returned by exec>
<?php
exec("sed -i 's/animal=*/animal=$_REQUEST['type']/g' /home/user1234/animals/file.props");
echo 'file modified'
?>
发生的情况如下:
<?php
ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL);
if(!empty($_REQUEST['animal_type'])){
exec('sed -i '.escapeshellarg('s/animal=*/animal='.$_REQUEST['animal_type'].'/g')." /home/user1234/animals/file.props");
echo 'File has been updated';
}
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<select name="animal_type">;
<option value="true">bat</option>;
<option value="false">fish</option>;
<option value="cat">cat</option>;
<option value="dog">dog</option>;
</select>
<input type="submit" name="Submit" value="Submit" />
</form>
页面已加载
exec('sed…')被处理,结果被放入html中
用户单击submit并被带到操作中指定的URI。在本例中,它是exec结果的最后一行('sed…)
我建议您通过将表单更改为post到另一个页面
,然后在changeFile.php中添加修改VPS文件的逻辑来简化此操作
例如,在changeFile.php中,添加逻辑来更改内容,如下所示:
<form action=some string returned by exec>
<?php
exec("sed -i 's/animal=*/animal=$_REQUEST['type']/g' /home/user1234/animals/file.props");
echo 'file modified'
?>
sed命令是否直接从cli工作?用户权限问题,当人们在php.ini中的禁用函数列表中尝试此命令时总是如此。请小心将数据直接传递到shell。像animal=$type
有人可以用一个引号发布一个animal_类型并执行shell命令。谢谢Bret!我现在取得了一些进展,并更新了我的帖子。我添加了一些注释,希望能让这更清楚。关键是希望exec()在post_test.php的第二个页面上运行。否则,exec()将在页面首次加载时以及在用户有机会指定动物类型之前运行。我明白你的意思。我想我的原始代码是关闭的,因为我不希望它们在更改后被重定向到页面。我在原来的帖子中再次更新了我的代码。我的大脑现在有点混乱,所以我最好休息5分钟:)再次感谢:)这看起来很有效。我现在唯一的问题是文件中的“animal=cat”值没有改变,但是表单只是添加到它上面,所以在尝试了几次之后,我得到了:“animal=catdogdog”。我希望这是有道理的!您的正则表达式需要从s/animal=*/
更改为s/animal=.*/
。*表示:匹配上一个字符的零次或多次出现
和。表示任何字符
。因此,*
表示任何字符零次或多次<代码>=*
表示等号零次或多次
。