我尝试发出:
sudo apt-get update
和
sudo apt-get install openjdk-7-jre joe wget
在php的远程计算机上,
我一直在四处寻找并尝试了两种方法:
第一
session_start();
$command = "ssh -o 'StrictHostKeyChecking no' -i /var/www/.ssh/my-keypair555.pem ubuntu@{$_SESSION['host']} \"sudo apt-get update\"";
echo $command."<br/>";
echo exec($command, $output);
print_r($output);
$command = "ssh -o 'StrictHostKeyChecking no' -i /var/www/.ssh/my-keypair555.pem ubuntu@{$_SESSION['host']} \"sudo apt-get install -y openjdk-7-jre joe wget\"";
echo $command."<br/>";
echo exec($command, $output);
print_r($output);
此代码似乎根本没有执行, (命令被打印但输出数组似乎是空的。)
其次: 来自http://php.net/manual/en/function.ssh2-exec.php
的改编版本session_start();
$connection = ssh2_connect($_SESSION['host'], 22, array('hostkey'=>'ssh-rsa'));
if (ssh2_auth_pubkey_file(
$connection,
'ubuntu',
'/var/www/.ssh/id_rsa.pub',
'/var/www/.ssh/id_rsa')
) {
$shell = ssh2_shell($connection,"bash");
$cmd = "echo '[start]';sudo apt-get update;sudo apt-get install -y openjdk-7-jre joe wget;echo '[end]'";
$output = user_exec($shell,$cmd);
fclose($shell);
echo $output."<br/>";
} else {
die('Public Key Authentication Failed');
}
function user_exec($shell,$cmd) {
fwrite($shell,$cmd . "\n");
$output = "";
$start = false;
$start_time = time();
$max_time = 900; //time in seconds
while(((time()-$start_time) < $max_time)) {
$line = fgets($shell);
//echo $line;
if(!strstr($line,$cmd)) {
if(preg_match('/\[start\]/',$line)) {
$start = true;
echo "start";
}elseif(preg_match('/\[end\]/',$line)) {
return $output;
}elseif($start){
$output[] = $line;
echo $line."<br/>";
}
}
}
}
如果我使用此代码命令:
echo '[start]';sudo apt-get update;sudo apt-get install -y openjdk-7-jre joe wget;echo '[end]'
如果我登录到计算机并发出,则会显示
history
但似乎没有被执行,因为如果我发出
java
我收到了需要安装它的消息。
如果我发出
!1
apt-get update和apt-get install可以正确执行。
如果我在浏览器中运行php文件,我会得到以下输出:
欢迎使用Ubuntu 14.04.1 LTS(GNU / Linux 3.13.0-36-generic x86_64)*文档:https://help.ubuntu.com/系统信息发布日期:Sun Feb 8 17:20:45 UTC 2015系统负载:0.69进程:104使用/:9.8%7.74GB登录用户:0内存使用率:eth0的1%IP地址:10.74.190.178交换使用率:0%绘制此数据并管理此系统:https://landscape.canonical.com/获取云支持Ubuntu Advantage Cloud Guest:http://www.ubuntu.com/business/services/cloud 0个软件包可以更新。 0更新是安全更新。上次登录时间:2015年2月8日星期二17:20:50来自ec2-54-77-56-210.eu-west-1.compute.amazonaws.com echo'[start]'; sudo apt-get update; sudo apt- get install -y openjdk-7-jre joe wget; echo'[end]'ubuntu @ ip-10-74-190-178:〜$ echo'[start]'; sudo apt-get update; sudo apt-get in
- &GT;请注意,该命令在'install'
处被截断这可以解释为什么命令没有被执行。
任何人都可以帮我解决这个问题,我现在已经找了差不多两个星期而且似乎没有取得很大进展......
感谢,
桑德
答案 0 :(得分:0)
显然php.ini中的max_execution_time是这里的问题。
我用
调试了第二个脚本...
}elseif(preg_match('/\[end\]/',$line)) {
echo "[end]:".$line;
return $output;
}elseif($start){
...
和
} //while loop
echo "out of time";
}//function user_exec($shell,$cmd) {
并且都没有在浏览器页面的输出中执行。
$max_time = 900; //time in seconds
还不够,应该用:
set_time_limit(900);
执行了原始命令,但在执行时,php的超时停止了执行。
此外,第一个脚本应该遇到同样的问题,执行命令和执行过程中返回的php只需要很长时间。
我也是,但我认为这不是导致问题的原因:
$stream = ssh2_exec($connection,$cmd);
而不是原来的
fwrite($shell,$cmd . "\n");
总脚本:
<?php
sleep(30);
session_start();
$connection = ssh2_connect($_SESSION['host'], 22, array('hostkey'=>'ssh-rsa'));
if (ssh2_auth_pubkey_file(
$connection,
'ubuntu',
'/var/www/.ssh/id_rsa.pub',
'/var/www/.ssh/id_rsa')
) {
$cmd = "echo '[start]';sudo apt-get update;sudo apt-get install -y openjdk-7-jre joe wget;echo '[end]'";
$output = user_exec($connection,$cmd);
fclose($shell);
ob_end_flush();
echo $output."Halleluia!!!";
} else {
die('Public Key Authentication Failed');
}
function user_exec($connection,$cmd) {
$stream = ssh2_exec($connection,$cmd);
$output = "";
$start = false;
$start_time = time();
set_time_limit(900);
$max_time = 900; //time in seconds
while(((time()-$start_time) < $max_time)) {
$line = fgets($stream);
if(!strstr($line,$cmd)) {
if(preg_match('/\[start\]/',$line)) {
$start = true;
}elseif(preg_match('/\[end\]/',$line)) {
echo "[end]:".$line;
return $output;
}elseif($start){
if($line != ""){
ob_flush();
flush();
$output[] = $line;
echo $line."<br/>";
}
}
}
}
echo "out of time";
}
?>
希望这可以帮助任何有类似问题的人。
S上。