Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过代理PHP的SSH连接_Php_Ssh_Proxy_Phpseclib_Ssh2 Sftp - Fatal编程技术网

通过代理PHP的SSH连接

通过代理PHP的SSH连接,php,ssh,proxy,phpseclib,ssh2-sftp,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 解决方案(失败) 然后我找到了解决办法。我创建了**~/.ssh/config**文件并向其中添加了代理定义 Host x.x.x.x

是否可以使用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\u连接
函数没有使用ssh配置文件。有没有办法告诉函数使用它?

所以您要通过隧道连接到x.x.x.x,我假设这需要HTTP连接代理才能工作

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

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

使用phpseclib确实可能而且非常简单。之前使用的是php ssh2,工作正常,但没有通过代理建立连接的已知方法。phpseclib比php的ssh2更好。这意味着如果您使用的是ssh2,则没有ssh2连接。下面是为我工作的示例代码:

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

谢谢@neubert我现在无法尝试。我将在周一尝试,并让您知道结果。发布您的代码。我发布的不是一个合适的HTTP连接客户端-我发布的是一个如何更改phpseclib将使用的套接字资源的示例。您需要做的更改与我发布的不同。我的发布是j这是一个如何使用修改过的套接字的示例。我已经修改了您的代码以满足我的要求,但不幸的是,它对我不起作用。我现在没有该代码。对不起,与ssh2\u connect相比,此语法非常糟糕