带有exec和sed命令的php表单

带有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表单来更改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 '<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=.*/
    。*表示:
    匹配上一个字符的零次或多次出现
    和。表示
    任何字符
    。因此,
    *
    表示任何字符零次或多次<代码>=*
    表示
    等号零次或多次