2013-04-16 2 views
0

Я пытаюсь передать две машины по ssh и pipe, чтобы получить сообщение от одного к другому. Второй читает сообщение, формируя первую машину с sdtin и записывая в текстовый файл.Передача данных между двумя удаленными серверами с помощью popen, fgets и ssh

У меня есть машина, где у меня есть эта программа, но это не работает ...

$message = "Hello Boy"; 
$action = ('ssh [email protected] script.php'); 
$handle = popen($action, 'w'); 

if($handle){ 
    echo $message; 
    pclose($handle); 
} 

На другой машине, machineTwo я есть:

$filename = "test.txt";  
    if(!$fd = fopen($filename, "w"); 
    echo "error"; 
     } 
    else { 
      $action = fgets(STDIN); 
      fwrite($fd, $action); 
    /*On ferme le fichier*/ 
    fclose($fd);} 

ответ

0

Это решение работает:

МАШИНА ONE

Я отправить сообщение МАШИНЫ ВТОРОЙ после подключения к МАШИНЕ ВТОРОЙ с SSH. Я использую popen и fwrite

//MACHINE ONE 
$message = "Hello Boy"; 
$action = ('ssh [email protected] script.php'); //conection by ssh-rsa 
$handle = popen($action, 'w'); //pipe open between machineOne & two 

if($handle){ 
    fwrite($handle, $message); //write in machineTwo 
    pclose($handle); 
} 

МАШИНА ДВА

открыть файл с fopen и получить сообщение о МАШИНЕ ONE с fgets (STDIN);. Я пишу сообщение в открывшемся файле.

//MACHINETWO 
$filename = "test.txt";  
if(!$fd = fopen($filename, "w"); 
    echo "error"; 
} 

else 
{ 
    $message = fgets(STDIN); 
    fwrite($fd, $message); //text.txt have now Hello World ! 
    /*we close the file*/ 
    fclose($fd);  
} 
-1

Popen в основном используется для имеют две локальные программы связи с использованием «файла трубопровода».

Чтобы достичь того, чего вы хотите, вы должны попробовать библиотеку SSH2 PHP (интересная ссылка http://kvz.io/blog/2007/07/24/make-ssh-connections-with-php/)

В вашем случае вы могли бы сделать что-то подобное для PHP скрипт на machineOne:

if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist"); 
if (!($con = ssh2_connect("machineTwo", 22))) { 
    echo "fail: unable to establish connection\n"; 
} else { 
    if (!ssh2_auth_password($con, "root", "yourpass")) { 
     echo "fail: unable to authenticate\n"; 
    } else { 
     echo "okay: logged in...\n"; 

     if (!($stream = ssh2_exec($con, "php script.php"))) { //execute php script on machineTwo 
       echo "fail executing command\n"; 
      } else { 
       // collect returning data from command 
       stream_set_blocking($stream, true); 
       $data = ""; 
       while ($buf = fread($stream,4096)) { 
        $data .= $buf; 
       } 
       fclose($stream); 
       echo $data; //text returned by your script.php 
      } 
    } 
} 

Я предполагаю, что у вас есть все основания для этого, но зачем использовать PHP?

2

Вот самый простой способ сделать это (использует phpseclib, a pure PHP SSH2 implementation):

<?php 
include('Net/SSH2.php'); 

$ssh = new Net_SSH2('www.domain.tld'); 
if (!$ssh->login('username', 'password')) { 
    exit('Login Failed'); 
} 

echo $ssh->exec('php script.php'); 
?> 

С закрытым ключом RSA:

<?php 
include('Net/SSH2.php'); 

$ssh = new Net_SSH2('www.domain.tld'); 
$key = new Crypt_RSA(); 
$key->loadKey(file_get_contents('privatekey')); 
if (!$ssh->login('username', $key)) { 
    exit('Login Failed'); 
} 

echo $ssh->exec('php script.php'); 
?> 

Если script.php прослушивает стандартного ввода вы могли возможно сделать read()/write() или использовать enablePTY()

Смежные вопросы