我正在尝试最终使用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”,但我无法回应。无论如何都要手动将用户添加到已知主机列表?
答案 0 :(得分:1)
shell_exec()
作为一般情况,我不是让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'].'.');
}