【问题标题】:how to use ssh as sock5 with curl in php?如何在 php 中使用 ssh 作为 sock5 和 curl?
【发布时间】:2015-11-19 18:58:09
【问题描述】:
$connection = ssh2_connect($ip_ssh, 22);

if (ssh2_auth_password($connection,$username, $password)) {
    if ($tunnel = ssh2_tunnel($connection, '127.0.0.1', 443)) {
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_URL, "http://ipinfo.io");
        curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, true);
        curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:443");
        curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);

        $result = curl_exec($ch);   

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

我试过了,但是没有用。感谢您的关注 ............................................. ......................................

【问题讨论】:

    标签: php curl


    【解决方案1】:

    您不能将 SSH 隧道用作带有 cURL 的 SOCKS 代理,因为该隧道不代表 SOCKS 连接。

    ssh2_tunnel 返回的资源是一个套接字流(就像fsockopen 返回的一样)。

    即使在远程 SSH 服务器上使用 SOCKS 代理(例如Tor),我认为没有办法让本地服务器上的 cURL 通过隧道通过远程服务器上的 SOCKS 代理cURL 代理选项的任意组合。

    这里是一个使用隧道的例子:

    <?php
    
    $ip_ssh      = 'ssh_host';
    $username    = 'user';
    $password    = 'password';
    $remote_host = 'ipinfo.io';
    
    $connection = ssh2_connect($ip_ssh, 22);
    
    $addr = gethostbyname($remote_host);
    
    if (ssh2_auth_password($connection,$username, $password)) {
        if ($tunnel = ssh2_tunnel($connection, $addr, 80)) {
            $request = "GET / HTTP/1.0\r\n" .
                       "Host: $remote_host\r\n" .
                       "Connection: close\r\n\r\n";
    
            fwrite($tunnel, $request);
    
            $result = '';
    
            while (!feof($tunnel)) {
                $result .= fgets($tunnel);
            }
    
            echo $result;
        } else {
            echo "Tunnel creation failed.\n";
        }
    } else {
        echo "failed";
    }
    

    【讨论】:

    • 您好,感谢您的回复。请看这篇文章:stackoverflow.com/a/25407332/3149852。他的第一种方法和你的类似。出于我的原因,我不想使用它。但我喜欢他的第二个想法。但是,它没有用。它在“socket_getsockname($localsock, $YourInternetIPaccessible, $openedPort);”处失败你有什么想法让它发挥作用吗?
    • 我不认为代码按预期工作或做你想要的。为什么需要通过 SSH 隧道代理 cURL?
    • 因为 curl 可以使用选项 CURLOPT_COOKIEFILE。如果我用你的方法,那就很难了。
    • 用你的方法,如何将数据发布到 https 域。例如:facebook.com ?谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-11-10
    • 2016-09-08
    • 2011-01-13
    • 2014-09-25
    • 2011-12-19
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多