Как использовать exec () в php в сочетании с командой ssh ​​'hostname'? - PullRequest
0 голосов
/ 29 декабря 2011

У меня есть простой скрипт, который я пытаюсь запустить:

<?php
print exec('whoami');
$output2 = exec('ssh someotherhost ls -l /path/to/dir',$output);
print_r($output);
print_r($output2);
print $output2;
?>

Цель этого скрипта - запустить команду на другом сетевом сервере.Если я запускаю указанную выше команду ssh (заменяя фиктивные данные реальными данными) из командной строки: ssh someotherhost ls -l /path/to/dir

Она выводит соответствующие строки ls.Однако, когда я запускаю вышеупомянутый скрипт из того же каталога с помощью той же команды, он не выводится ни в одну из трех нижних строк печати.Тем не менее, exec() с whoami вверху распечатывается, как и ожидалось.Поэтому мой вопрос: почему первая команда работает, а не вторая?

Обратите внимание, что два сетевых сервера находятся во внутренней сети и настроены с помощью пар ключей сети ssh.Команда работает, только не из php.

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 31 декабря 2011

PHP может запускать команду ssh с другим пользователем, нежели вы делаете это из CLI.Возможно, пользовательский PHP запускает его, поскольку в его файле ключей нет ключа сервера.

Лично я бы просто использовал phpseclib, чистую реализацию PHP SSH . * 1005.*

0 голосов
/ 29 декабря 2011

Мне нужно было найти способ сделать это некоторое время назад, чтобы создать собственную панель управления для внутреннего сервера веб-разработки, и я много раз осмотрелся и обнаружил, что есть пакет SSH для PHP, который обычно поставляется с ssh вЭто.Возможно, вы захотите попробовать это:)

Вам потребуется сгенерировать ключ на своем сервере, чтобы ваш сервер мог подключиться к цели без пароля, для этого:

ssh-keygen -t rsa
ssh-copy-id root@targetmachine

Поиск в сети для получения дополнительной информации о генерации ключа RSA, в сети есть тонны.А затем просто сделайте небольшую функцию, подобную этой, и вы готовы выполнить множество команд:)

<?php

/**
 *
 * Runs several SSH2 commands on the devl server as root
 *
 */
function ssh2Run(array $commands){

        $connection = ssh2_connect('localhost');
        $hostkey = ssh2_fingerprint($connection);
        ssh2_auth_pubkey_file($connection, 'root', '/home/youruser/.ssh/id_rsa.pub', '/home/youruser/.ssh/id_rsa');

        $log = array();
        foreach($commands as $command){

                // Run a command that will probably write to stderr (unless you have a folder named /hom)
                $log[] = 'Sending command: '.$command;
                $log[] = '--------------------------------------------------------';
                $stream = ssh2_exec($connection, $command);
                $errorStream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);

                // Enable blocking for both streams
                stream_set_blocking($errorStream, true);
                stream_set_blocking($stream, true);

                // Whichever of the two below commands is listed first will receive its appropriate output.  The second command receives nothing
                $log[] = 'Output of command:';
                $log[] = stream_get_contents($stream);
                $log[] = '--------------------------------------------------------';
                $error = stream_get_contents($errorStream);
                if(strlen($error) > 0){
                        $log[] = 'Error occured:';
                        $log[] = $error;
                        $log[] = '------------------------------------------------';
                }

                // Close the streams
                fclose($errorStream);
                fclose($stream);

        }

        //Return the log
        return $log;

}

Кроме того, вас могут заинтересовать документы по SSH2 для php: http://ca3.php.net/manual/fr/book.ssh2.php

...