简体   繁体   English

PHP ssh2_tunnel:使用代理/袜子抛出ssh服务器?

[英]PHP ssh2_tunnel: Using proxy/socks throw ssh server?

I want using proxy/socks throw ssh server and i found nice example from here How do you proxy though a server using ssh (socks…) using php's CURL? 我想使用代理/袜子抛出ssh服务器,我从这里找到了一个很好的例子。 如何使用php的CURL通过ssh(袜子……)代理服务器? but example don't work, here is my code. 但是示例不起作用,这是我的代码。

<?php
$connection = ssh2_connect("64.246.126.25", 22);
if(ssh2_auth_password($connection, "ubnt", "ubnt"))
{
    if ($tunnel = ssh2_tunnel($connection, "127.0.0.1", 9999))
    {
        $url = "http://checkip.dyndns.com/";
        $agent= 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_USERAGENT, $agent);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:9999");
        curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
        $result = curl_exec($ch);   
        echo $result;

    }else{
        echo "Tunnel creation failed.\n";
    }
} 
else
{
    echo "failed!";
}
?>

When i excute this script i have error response: 当我执行此脚本时,我会收到错误响应:

Warning: ssh2_tunnel() [function.ssh2-tunnel]: Unable to request a channel from remote host in /home/domain.com/ssh2/index.php on line 7
Tunnel creation failed. 

I will googled for this error and trying fix but can't solve problems. 我将用Google搜索此错误并尝试修复,但无法解决问题。

Anyone can help me? 有人可以帮助我吗?

It seems ssh_tunnel does not work like that, ssh_tunnel will request the "$connection" to perform a tunnel to the specified ip / port. 似乎ssh_tunnel不能那样工作,ssh_tunnel会请求“ $ connection”执行到指定ip /端口的隧道。

In your code i assume you are trying to create a local port which listens for the cURL requests as proxy, but basically you are asking the ssh server to connect to itself (127.0.0.1). 在您的代码中,我假设您正在尝试创建一个本地端口,以侦听cURL请求作为代理,但是基本上,您是在要求ssh服务器连接到其自身(127.0.0.1)。

As you may see in my example, the tunnel to Google is only a stream through which you may send stream requests 如您在我的示例中所见,通往Google的隧道只是一个流,您可以通过该流发送流请求

$connection = ssh2_connect($sshServerIP, 22);
ssh2_auth_password($connection, $sshServerUser, $sshServerPass);
$sock = ssh2_tunnel($connection, "google.com", 80);
fwrite($sock, "GET /? HTTP/1.0\r\n\r\n");
$body = "";
while (!feof($sock))
$body .= fgets($sock);
echo $body;

You can open a local port before requesting the tunnel to your ip / port through: 您可以在通过以下方法请求到您的IP /端口的隧道之前打开本地端口:

$localsock = socket_create_listen(0);
socket_getsockname($localsock, $YourInternetIPaccessible, $openedPort);

And then your code with these changes: 然后您的代码进行了以下更改:

$connection = ssh2_connect("64.246.126.25", 22);
if(ssh2_auth_password($connection, "ubnt", "ubnt"))
{
    if ($tunnel = ssh2_tunnel($connection, $YourInternetIPaccessible, $openedPort))
    {
        $url = "http://checkip.dyndns.com/";
        $agent= 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_USERAGENT, $agent);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:$openedPort");
        curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
        $result = curl_exec($ch);   
        echo $result;

    }else{
        echo "Tunnel creation failed.\n";
    }
} 
else
{
    echo "failed!";
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM