2013-03-06 59 views
0

我想創建一個php窗體來更改我的vps文件中的值。這裏是我想要的代碼:php形式與執行和sed命令

<?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>'; 
?> 

我已經更新了我的代碼。目前它只是將00添加到file.props中的animal =值,而不是使用表單中選定的值覆蓋當前值。

在頁面上的形式值也永遠不會改變,並始終保持爲蝙蝠。

我每次嘗試刷新頁面時都會收到此消息:「要顯示此頁面,Firefox必須發送將重複之前執行的任何操作(例如搜索或訂單確認)的信息。」

是否有更好的方法來改變sed和exec以外的這些值?或者我仍然在我的代碼中做了不正確的事情?

+0

sed命令是否直接從cli工作? – mkaatman 2013-03-06 21:20:06

+0

用戶權限問題,總是當人們嘗試這個 – 2013-03-06 21:20:56

+0

是你的php.ini中的disabled_functions列表中的'exec()'? – Pitchinnate 2013-03-06 21:26:02

回答

1

表單的action attribute需要指定一個URI。相反,有一個返回字符串的函數exec。我假設這個字符串不是一個有效的URI。所以在HTML源會是這個樣子:

<form action=some string returned by exec> 

正在發生的事情是這樣的:

  1. 頁面加載
  2. EXEC(「sed的......」 )被處理並且結果被放入html中
  3. 用戶單擊提交併被帶到在操作中指定的URI。在這種情況下,它是從高管的結果的最後一行(「sed的....」)

我建議你通過改變形式張貼到<form action="changeFile.php">另一個頁面,然後在changeFile.php簡化這個加修改VPS文件的邏輯。

例如,在changeFile.php添加邏輯改變的是這樣的內容:

<?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> 
+0

謝謝佈雷特!我現在正在取得一些進展並更新了我的文章。 – jcrane 2013-03-06 21:58:10

+0

我已經添加了一些註釋,希望能夠使這一點更加清晰。關鍵是你想讓exec()在第二頁post_test.php上運行。否則,在第一次加載頁面時以及在用戶有機會指定animal_type之前,exec()正在運行。 – Brett 2013-03-06 22:10:48

+0

我明白你的意思了。我想我的原始代碼是關閉的,因爲我不希望他們在更改完成後被重定向到一個頁面。我在原帖中再次更新了我的代碼。我的大腦有點困惑,所以我最好花5分鐘:) – jcrane 2013-03-06 22:40:02