Выполнение нескольких команд bash из php на удаленном компьютере

0

Я пытаюсь выпустить:

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 в

  • много пустых строк и время от времени двойное сообщение вроде alal или l -l -

→ обратите внимание, что команда усекается при установке 'install'

что объясняет, почему команда не выполняется.

Может кто-нибудь дать мне руку на это, я искал почти две недели и не очень много продвигаюсь...

благодаря,

шлифовальная машинка

Теги:
ssh
amazon-ec2

1 ответ

0
Лучший ответ

По-видимому, проблема с 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";
}   
?>

Надеюсь, это поможет любому, у кого есть аналогичная проблема.

С.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню