2013-10-31 254 views
3

我需要在Web窗體上捕獲用戶輸入並將其傳遞給腳本以創建用戶帳戶,但我無法使其工作。到目前爲止,我有一個add_user.sh腳本讀取這樣的:從PHP調用bash腳本

adduser -u $NAME -p $PASS -g users -s /bin/bash 

但林不知道這是怎麼回事捕獲用戶從Web表單中輸入的數據?

+0

你必須在你用來調用add_user.sh的php命令上傳遞這些參數。就像這樣:'passthru(「add_user.sh -u $ NAME -p $ PASS」);'。 – Jacobson

+2

如果'$ NAME'來自Web窗體,那麼你已經使**絕對**確定你正在使用正確的方法將它傳遞給命令行應用程序。考慮如果用戶輸入'; rm -rf /'作爲他們的用戶名...例如http://php.net/escape_shell_arg –

+1

當然,馬克B說的是完全正確的。 – Jacobson

回答

2

可以構建成一個字符串,然後用exec如果您的服務器有它啓用

$str = 'adduser -u ' . $NAME . ' -p ' . $PASS . ' -g users -s /bin/bash'; 
exec(escapeshellcmd($str)); 

我應該有可能前面提到的,許多主機禁用該功能,執行命令行的任何功能命令,出於安全原因, 。僅僅因爲這存在並不是一個好主意。

+3

有點危險,取決於安全設置和$ NAME和$ PASS的數據源。 http://php.net/manual/en/function.escapeshellcmd.php http://php.net/manual/en/function.escapeshellarg.php – Will

+1

Marc B對OP的評論也適用。在調用命令之前,必須徹底清理「$ NAME」和「$ PASS」。 –

+0

謝謝。我怎麼能通過PHP調用它? – user2938994

0

寫腳本add_user.sh像這樣(介意引號):

#!/bin/sh 
adduser -u "$1" -p "$2" -g users -s /bin/bash 

使其可執行:

[email protected]$ chmod +x add_user.sh 

並在php從稱其爲:

<?php 
    $command="/path/to/add_user.sh ".escapeshellarg($name)." ".escapeshellarg($pass); 
    exec ($command,$output=array(),$return_value); 
    if($return_value!==0) { 
     # Oh dear! something bad happened 
    } 
?> 

(我沒有php inst這裏alled,所以我不能徹底地測試我的答案)

如果你不想用你的若干輔助腳本,就可以直接做:

<?php 
    $command="/path/to/adduser -u ".escapeshellarg($name)." -p ".escapeshellarg($pass)." -g users -s /bin/bash"; 
    exec ($command,$output=array(),$return_value); 
    if($return_value!==0) { 
     # Oh dear! something bad happened 
    } 
?> 

請確保您測試返回值(就像我那樣)。您將在數組$output中獲得命令的輸出。

對於每個參數使用escapeshellarg比在已建好的完整命令上調用escapeshellcmd安全得多。