2011-01-13 32 views
5

Tôi đang cố gắng thực hiện các lệnh từ xa từ bên trong tập lệnh php trên ssh và tôi muốn đầu ra từ các lệnh (stdout và stderr) được phát trực tuyến tới máy chủ gốc.Làm cách nào để thực hiện các lệnh từ xa trong PHP qua ssh?

Tôi biết trong Perl và Ruby điều này là có thể. Tôi không thể tìm thấy bất kỳ ví dụ như vậy trong php.

Code:

$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; 
     } 
    } 
    } 
} 

Nhưng khi tôi thực hiện nó như $php remote.php này, tôi nhận được một lỗi:

PHP Fatal error: Call to undefined function ssh2_connect() 
in /home/tester/PHP_SSH2/remote.php on line 6 

cách tốt nhất để thực hiện các lệnh từ xa trong PHP qua ssh là gì?

+1

Dường như bạn chưa cài đặt gói PECL SSH2. –

+0

tôi đã cố gắng cài đặt SSH2, @ http://www.php.net/manual/en/ssh2.installation.php sudo pecl install ssh2 kênh: //pecl.php.net/ssh2-v Đây là stout: Không thể tải xuống pecl/ssh2 trong trạng thái ưa thích "ổn định", bản phát hành mới nhất là phiên bản 0.11.2, ổn định "beta", sử dụng "channel: //pecl.php.net/ssh2-0.11.2" để cài đặt parsePackageName(): "phiên bản" không phải là phiên bản hợp lệ cũng như trạng thái hợp lệ trong "kênh: //pecl.php.net/ssh2-version" tên gói/tệp gói không hợp lệ "kênh: //pecl.php.net/ssh2-version " cài đặt không thành công và nếu tôi thử từ nguồn nhưng không thể tìm ra cách biên dịch config.m4 – kamal

Trả lời

5

Nếu bạn không thể thêm gói php do quan liêu, đây là một lớp đơn giản mà có thể thực hiện Bí quyết

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; 
    } 
} 
+0

Bạn đang nói rằng anh ta có thể thêm một gói php, nếu đây không phải là một lá cờ đỏ. Bạn đang nói về loại PHP nào? Một số thư viện của bên thứ ba? Bất kỳ đề xuất? – Klaus

+0

Tôi nghĩ rằng tôi đã đề cập đến gói secl2 pecl. Tuy nhiên kể từ khi trả lời cách đây gần 5 năm, Composer đã trở thành một điều hữu ích cho php. Kiểm tra getcomposer.org cho tất cả các gói bạn có thể muốn. –

3

Bạn đã cài đặt gói SSH2 chưa?

http://www.php.net/manual/en/ssh2.installation.php

+0

tôi đã thử, quá trình cài đặt không thành công sudo pecl cài đặt ssh2 kênh: //pecl.php.net/ssh2-version [sudo] mật khẩu cho thử nghiệm: Không thể tải xuống pecl/ssh2 trong trạng thái ưa thích "ổn định", bản phát hành mới nhất là phiên bản 0.11.2, ổn định " beta ", sử dụng" kênh: //pecl.php.net/ssh2-0.11.2 "để cài đặt parsePackageName():" phiên bản "không phải là phiên bản hợp lệ cũng như trạng thái hợp lệ trong" kênh: //pecl.php. net/ssh2-phiên bản " tên gói/tệp gói không hợp lệ" kênh: //pecl.php.net/ssh2-version " cài đặt không thành công – kamal

+0

@ người bỏ phiếu ẩn danh, tại sao bạn bỏ phiếu xuống? –

1

với xác thực bằng khóa SSH quản lý nó khá đơn giản:

$cmd = 'ssh [email protected] script ' . $arguments . ' 2>/dev/null'; 
$result = shell_exec($cmd); 

PHP 5,5

Các vấn đề liên quan