文件IO - PHP shell_exec触摸重定向和adduser


file io - php shell_exec touch redirect and adduser

我试图最终使用php的shell_exec函数来创建新的Linux用户。然而,即使在调试中,我也遇到了问题。这是我的代码

<?PHP 
function adduser($username,$password,$server){ 
    try{
        //3 debug statements
        $output=shell_exec("pwd"); 
        echo $output;
       shell_exec("touch test.txt");
        //3 debug statements are requested by Christian
        echo '<pre>';
        print_r(execute('pwd'));
        print_r(execute('touch test.txt'));
        //actuall code
        $output=shell_exec("ssh root@$server '"adduser $username; echo $password | passwd $username --stdin'"");
    }
    catch(Exception $e){
        echo 'could not add user '.$e->getMessage();
    }
} 
$servers = array('192.168.1.8'); 
foreach($servers as $server){ 
    echo $_GET['USER']."   ".$_GET['PASSWORD'];
    adduser($_GET['USER'],$_GET['PASSWORD'],$server); 
}

try-catch语句不做任何事情,使我相信shell错误不会传播为PHP错误(Python也是这样)。$output=shell_exec("pwd")行返回正确的目录。然而,shell_exec("touch test.txt")行不能创建文件test.txt(即使我给出完整路径'/home/user/…/test.txt')。

不用说,用于添加用户的实际代码也不起作用。

EDIT我设法修复了一些代码。touch test.txt错误是由于权限不足造成的。Apache使用用户www-data登录,我只是为该用户创建了一个主文件夹,并确保触摸了该主文件夹中的一个文件。

按照Christian的要求,添加了三个调试语句,但是现在出现了问题。

EDIT进一步检查,这与无法以root身份ssh作为用户www-data登录有关。ssh -v返回debug1: read_passphrase: can't open /dev/tty: No such device or address。我的猜测是ssh正在询问通用的"您是否想永久地将xxx添加到known_hosts",但我无法响应。是否可以手动将用户添加到已知主机列表中?

    许多(大多数?)PHP的内部函数不会抛出异常,它们会引发错误。我认为你永远不会看到shell_exec() 抛出异常。
  • 我可能会var_dump()返回值,只是为了确保您明确地知道它返回的是什么。
  • 我还建议使用escapeshellarg()等函数来避免输入问题。

作为一般情况,我编写一个shell脚本来完成我需要的一切,然后从PHP调用它,而不是让PHP依次执行几个命令。在调试的过程中少了一个环节,我发现这样做容易多了。

关于您的SSH命令本身,因为apache是作为www-data执行的,它如何以root身份登录到有问题的机器?您是否已将apache用户的密钥添加到远程机器。

请使用我在这里找到的函数

运行以下代码并告诉我们它的输出:

echo '<pre>';
print_r(execute('pwd'));
print_r(execute('touch test.txt'));

编辑:如果你想让我的脚本更面向OO:

function execute_o($cmd,$in){
    $out=execute($cmd,$in);
    if($out['return']!=0)
        throw new Exception('Error '.$out['return'].': '.$out['stderr'].'.');
}