php shell_exec touch redirect和adduser

时间:2011-04-17 23:56:23

标签: php file-io shell-exec

我正在尝试最终使用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')。

毋庸置疑,添加用户的实际代码也不起作用。

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

根据Christian的要求,添加三个调试语句现在会引起问题。

编辑进一步检查时,与用户www-data登录时无法以root身份ssh。 ssh -v返回debug1: read_passphrase: can't open /dev/tty: No such device or address。我的猜测是ssh要求通用“你想永久地将xxx添加到known_hosts”,但我无法回应。无论如何都要手动将用户添加到已知主机列表?

2 个答案:

答案 0 :(得分:1)

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

作为一般情况,我不是让PHP按顺序执行几个命令,而是编写一个shell脚本来完成我需要的所有操作,然后从PHP调用它。调试时,链中的链接少一个,我发现我更容易。

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

答案 1 :(得分:1)

请使用我的功能found here

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

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'].'.');
}