2013-10-31 50 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安全得多。