2016-06-02 52 views
0

Ist es möglich, SSH-Verbindung über Proxy mit PHP herzustellen?SSH-Verbindung über Proxy PHP

Mein PHP-Code ist

$connection = ssh2_connect('x.x.x.x'); 

Aber es gibt einen Fehler unter

PHP Warning: ssh2_connect(): Unable to connect to x.x.x.x 

Ich kann nicht SSH-Verbindung über die Kommandozeile etablieren.

ssh [email protected] 

Solution (FAIL)

Dann fand ich Lösung. Ich habe **~/.ssh/config** Datei erstellt und Proxy-Definitionen hinzugefügt.

Host x.x.x.x 
    Hostname x.x.x.x 
    User root 
    ProxyCommand /usr/bin/corkscrew proxy.somewebsite.com 10080 %h %p 

Danach konnte ich eine Verbindung über die Kommandozeile :)

Aber ich kann nicht noch eine Verbindung mit PHP-Code ssh. Ich bekomme immer noch den gleichen Fehler :(

Problem hier ist, dass ssh2_connection Funktion nicht ssh-Konfigurationsdatei verwendet wird. Gibt es eine Möglichkeit, die Funktion zu sagen, es zu benutzen?

Antwort

0

Sie sind also die Verbindung Tunneling xxxx bis Corkscrew, die, wie ich annehme, HTTP CONNECT Proxies benötigt, um zu funktionieren.

HTTP CONNECT ist ein ziemlich einfaches Protokoll, also lasse ich Sie das herausfinden, aber sobald Sie haben, können Sie phpseclib verwenden (was Ich sollte beachten Sie, dass Sie nicht in Ihrem ursprünglichen Post verwenden) das Socket-Objekt zu ändern - um das Socket-Objekt vorzubereiten, dh, anstatt den Hostnamen und die Portnummer an den Konstruktor zu übergeben, übergeben Sie die s Rocket. Beispielcode:

<?php 
// http://us3.php.net/manual/en/context.socket.php 
$opts = array(
    'socket' => array(
     'bindto' => '192.168.1.100:0', 
    ), 
); 
$context = stream_context_create($opts); 
$socket = stream_socket_client('tcp://example.net:80', $errno, $errstr, ini_get('default_socket_timeout'), STREAM_CLIENT_CONNECT, $context); 

$ssh = new Net_SSH2($socket); 

Weitere Informationen:

https://github.com/phpseclib/phpseclib/issues/742#issuecomment-122351289

+0

Dank @neubert Ich bin nicht in der Lage, es jetzt zu versuchen. Ich werde es Montag versuchen und Sie Ergebnis wissen lassen. –

+0

Leider funktioniert es nicht für mich. –

+0

Geben Sie Ihren Code ein. Was ich gepostet habe, war kein richtiger HTTP CONNECT Client - was ich gepostet habe, war ein Beispiel dafür, wie man Änderungen an der Socket-Ressource vornimmt, die phpseclib verwenden wird. Die Änderungen, die Sie vornehmen müssen, unterscheiden sich von denen in meinem Beitrag. Mein Beitrag war nur ein Beispiel dafür, wie man einen modifizierten Sockel benutzt. – neubert

1

der Tat möglich und ganz einfach mit phpseclib. War mit PHP ssh2 vor und funktionierte gut, aber keine bekannte Möglichkeit, Verbindung über Proxy herzustellen. Phpseclib vergleichsweise besser als php ssh2. Dies bedeutet kein ssh2_connect, wenn Sie das verwenden. Hier ist Beispielcode, der für mich arbeitet:

public function connect() 
     { 
      $auth = base64_encode($this->proxyUser.':'.$this->proxyPass); 

      $fsock = fsockopen($this->proxyHost, $this->proxyPort); 
      $request = "CONNECT $this->ssh_host:$this->ssh_port HTTP/1.0\r\nContent-Length: 0\r\nProxy-Authorization: Basic $auth\r\n\r\n"; 

      if(fputs($fsock, $request) != strlen($request)) { 
       sys_error("Unable to connect to proxy"); 
      } 

      $response = fgets($fsock); //Response should be 'Connection Established' 

      $this->sftp = new Net_SFTP($fsock); //Will work similarly for Net_SSH 

      if(!$this->sftp->login($this->ssh_auth_user, $this->ssh_auth_pass)){ 
       sys_error('Login to sftp server failed'); 
       return false; 
      } 

      return true; 
     }