Я пытаюсь выпустить:
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 и apt-get install выполняются должным образом.
Если я запустил php файл в браузере, я получаю следующий вывод:
Добро пожаловать в Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-36-generic x86_64) * Документация: https://help.ubuntu.com/ Информация о системе с 5 февраля 17:20:45 UTC 2015 Загрузка системы: 0.69 Процессы: 104 Использование /: 9.8% из 7.74GB Пользователи, вошедшие в систему: 0 Использование памяти: 1% IP-адрес для eth0: 10.74.190.178 Использование swap: 0% График этих данных и управление этой системой по адресу: https://landscape.canonical.com/ Получить облачную поддержку с Ubuntu Advantage Cloud Guest: http://www.ubuntu.com/business/services/cloud 0 пакетов можно обновить. 0 обновлений - это обновления для системы безопасности. Последний вход: Вс Фев 8 17:20:50 2015 от 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 в
→ обратите внимание, что команда усекается при установке 'install'
что объясняет, почему команда не выполняется.
Может кто-нибудь дать мне руку на это, я искал почти две недели и не очень много продвигаюсь...
благодаря,
шлифовальная машинка
По-видимому, проблема с max_execution_time в php.ini была здесь.
Я отлаживал второй скрипт с помощью
...
}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";
}
?>
Надеюсь, это поможет любому, у кого есть аналогичная проблема.
С.