【问题标题】:SSH connection through proxy PHP通过代理 PHP 的 SSH 连接
【发布时间】:2017-12-30 00:12:55
【问题描述】:

是否可以使用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

解决方案(失败)

然后我找到了解决方案。我创建了**~/.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 配置文件。有没有办法告诉函数使用它?

【问题讨论】:

    标签: php ssh proxy phpseclib ssh2-sftp


    【解决方案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;
            }
    

    【讨论】:

    • 这个语法比 ssh2_connect 糟糕
    【解决方案2】:

    因此,您正在通过Corkscrew 建立与 x.x.x.x 的连接,我假设这需要 HTTP CONNECT 代理才能工作。

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

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

    【讨论】:

    • 谢谢@neubert 我现在无法尝试。我会在星期一试一试,然后告诉你结果。
    • 发布您的代码。我发布的不是正确的 HTTP CONNECT 客户端 - 我发布的是如何更改 phpseclib 将使用的套接字资源的示例。您需要进行的更改与我帖子中的更改不同。我的帖子只是一个如何使用修改后的套接字的示例。
    • 我已经修改了您的代码以符合我的要求,但不幸的是它对我不起作用。抱歉,我现在没有那个代码。
    猜你喜欢
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多