Я пытаюсь выполнить удаленные команды из php-скрипта поверх ssh, и я хочу, чтобы выходные данные из команд (stdout и stderr) передавались потоку на исходный узел.
Я знаю, что в Perl и Ruby это возможно. Я не мог найти таких примеров в php.
Код:
$ip = 'kssotest.yakabod.net'; $user = 'tester'; $pass = 'kmoon77'; $connection = ssh2_connect($ip); ssh2_auth_password($connection,$user,$pass); $shell = ssh2_shell($connection,"bash"); $cmd = "echo '[start]';your commands here;echo '[end]'"; $output = user_exec($shell,$cmd); fclose($shell); function user_exec($shell,$cmd) { fwrite($shell,$cmd . "\n"); $output = ""; $start = false; $start_time = time(); $max_time = 2; //time in seconds while(((time()-$start_time) < $max_time)) { $line = fgets($shell); if(!strstr($line,$cmd)) { if(preg_match('/\[start\]/',$line)) { $start = true; }elseif(preg_match('/\[end\]/',$line)) { return $output; }elseif($start){ $output[] = $line; } } } }
Но когда я выполняю его как этот $php remote.php
, я получаю сообщение об ошибке:
PHP Fatal error: Call to undefined function ssh2_connect() in /home/tester/PHP_SSH2/remote.php on line 6
Каков наилучший способ выполнения удаленных команд на PHP через ssh?
Если вы не можете добавить пакеты php из-за волокиты, вот простой класс, который может сделать трюк
class ExecuteRemote { private static $host; private static $username; private static $password; private static $error; private static $output; public static function setup($host, $username=NULL, $password=NULL) { self::$host = $host; self::$username = $username; self::$password = $password; } public static function executeScriptSSH($script) { // Setup connection string $connectionString = self::$host; $connectionString = (empty(self::$username) ? $connectionString : self::$username.'@'.$connectionString); // Execute script $cmd = "ssh $connectionString $script 2>&1"; self::$output['command'] = $cmd; exec($cmd, self::$output, self::$error); if (self::$error) { throw new Exception ("\nError sshing: ".print_r(self::$output, true)); } return self::$output; } }
Вы установили пакет SSH2?
Установка пакета PECL SSH2 – это PITA. Попробуйте phpseclib, чистую реализацию PHP SSH . Взгляните на это сообщение, чтобы узнать, почему следует избегать расширения PECL SSH2 любой ценой:
по крайней мере, на ubuntu: следующие инструкции работают: http://kevin.vanzonneveld.net/techblog/article/make_ssh_connections_with_php/ make_ssh_connections_with_php
С аутентификацией, управляемой SSH-ключами, это довольно просто:
$cmd = 'ssh user@host script ' . $arguments . ' 2>/dev/null'; $result = shell_exec($cmd);
PHP 5.5