从 PHP 调用 Bash 脚本

3

我需要在网页表单中获取用户输入并将其传递给脚本以创建用户账户,但是我无法使其正常工作。到目前为止,我有一个名为add_user.sh的脚本,内容如下:

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

但我不确定那是否能够捕获用户从网页表单输入的数据?


你需要在调用add_user.sh的php命令中传递这些参数。类似这样:passthru("add_user.sh -u $NAME -p $PASS"); - Jacobson
2
如果$NAME来自Web表单,那么你必须绝对确保使用正确的方法将其传递给命令行应用程序。考虑一下如果用户将; rm -rf /作为用户名输入会发生什么...例如:http://php.net/escape_shell_arg - Marc B
1
当然,Marc B所说的完全是真的。 - Jacobson
2个回答

2

如果您的服务器启用了它,您可以将其构建成字符串,然后使用exec

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

在此之前,我应该注意到许多主机出于安全原因禁用此功能以及执行命令行命令的任何函数。仅仅因为它存在并不意味着这是一个好主意。


3
根据$NAME和$PASS的安全设置和数据源,存在某种危险性。 http://php.net/manual/zh/function.escapeshellcmd.php http://php.net/manual/zh/function.escapeshellarg.php - Will
1
Marc B的评论也适用于OP。在调用命令之前,必须彻底清理$NAME$PASS - lethal-guitar
哦,亲爱的,这相当危险 :) 不要使用这种方法 - gniourf_gniourf
我编辑了我的回答。quasivivo是正确的,我添加了那个函数。 - Machavity
我想使用用户名 gniourf -g admin 或类似的东西进行注册,比如 :)请不要使用这种方法。 - gniourf_gniourf

0

编写您的脚本add_user.sh,如下所示(注意引号):

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

将其变为可执行文件:

me@somewhere$ 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,所以无法彻底测试我的答案)

如果您不想使用辅助脚本,可以直接执行以下操作:

<?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更安全。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接