【问题标题】:PHP ssh2_tunnel: Using proxy/socks throw ssh server?PHP ssh2_tunnel:使用代理/socks 抛出 ssh 服务器?
【发布时间】:2014-03-31 15:39:13
【问题描述】:

我想使用代理/socks throw ssh 服务器,我从这里How do you proxy though a server using ssh (socks…) using php’s CURL? 找到了很好的示例,但是示例不起作用,这是我的代码。

<?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!";
}
?>

当我执行这个脚本时,我有错误响应:

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. 

我会搜索这个错误并尝试修复但无法解决问题。

谁能帮帮我?

【问题讨论】:

    标签: php curl ssh proxy


    【解决方案1】:

    ssh_tunnel 好像不是这样工作的,ssh_tunnel 会请求“$connection”来执行到指定 ip/port 的隧道。

    在您的代码中,我假设您正在尝试创建一个本地端口,该端口作为代理侦听 cURL 请求,但基本上您是在要求 ssh 服务器连接到自身 (127.0.0.1)。

    正如您在我的示例中看到的,通往 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;
    

    您可以在通过以下方式请求隧道到您的 ip / 端口之前打开一个本地端口:

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

    然后您的代码进行了这些更改:

    $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!";
    }
    

    【讨论】:

    • 我尝试了您的代码,但是当我添加此行“socket_getsockname($localsock, $YourInternetIPaccessible, $openedPort);”时服务器没有响应。我怎样才能在 ubuntu 终端中获得 $YourInternetIPaccessible?谢谢。
    • 你测试你的代码了吗?我尝试过,但在“socket_getsockname($localsock, $YourInternetIPaccessible, $openedPort);”这一行出现错误。
    • 什么错误,无法创建监听套接字?
    猜你喜欢
    • 2011-01-13
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2013-01-15
    • 1970-01-01
    相关资源
    最近更新 更多