通过代理PHP连接SSH

时间:2016-06-02 17:13:28

标签: php ssh proxy phpseclib ssh2-sftp

是否可以通过代理使用php建立ssh连接?

我的PHP代码是

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

但是它会给出一个错误

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

我也无法通过命令行建立ssh连接。

ssh root@x.x.x.x

解决方案(FAIL)

然后我找到了解决方案。我创建了**~/.ssh/config**文件并向其添加了代理定义。

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

之后我可以通过命令行连接到ssh :)

但我仍然无法连接php代码。我仍然得到同样的错误:(

这里的问题是ssh2_connection函数没有使用ssh配置文件。有没有办法告诉函数使用它?

2 个答案:

答案 0 :(得分:1)

使用phpseclib确实可行且非常简单。之前是使用php ssh2并且工作正常但没有已知的方法通过代理建立连接。 phpseclib比php的ssh2更好。这意味着没有ssh2_connect,如果你正在使用它。以下是适用于我的示例代码:

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

答案 1 :(得分:0)

所以你通过Corkscrew将连接隧道连接到x.x.x.x,我假设它需要HTTP CONNECT代理才能工作。

HTTP CONNECT是一个相当简单的协议,所以我会让你弄清楚,但是,一旦你有了,你可以使用phpseclib(我应该注意到你并没有在你的orig帖子中实际使用)改变套接字对象 - 准备套接字对象。即。所以不是将主机名和端口号传递给传递套接字的构造函数。示例代码:

<?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); 

更多信息:

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