我试图最终使用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的内部函数不会抛出异常,它们会引发错误。我认为你永远不会看到
- 我可能会var_dump()返回值,只是为了确保您明确地知道它返回的是什么。 我还建议使用escapeshellarg()等函数来避免输入问题。
shell_exec()
抛出异常。作为一般情况,我编写一个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'].'.');
}