如何使用php的CURL使用ssh(socks ...)代理服务器?

时间:2010-02-05 09:41:37

标签: php curl proxy

我想使用ssh,类似这样:

ssh -D 9999 username@ip-address-of-ssh-server

但在php CURL中,但我真的不知道如何做到这一点?

我注意到“CURLPROXY_SOCKS5”作为php网站中的一个类型,但是猜测那不行,因为它不是真的袜子,它是ssh ...

我目前正在使用此代码:

curl_setopt($ch, CURLOPT_PROXY, ‘ip:port'); 

但是我使用的是免费代理,而且速度很慢且不可靠,我也会通过此代理发送敏感信息。这就是为什么我想通过我信任的保存服务器代理它,但我只有ssh设置它并且无法托管正确的代理。

5 个答案:

答案 0 :(得分:4)

您可以在PHP脚本中使用libssh2和curl。

  • 首先,您需要来自PECL网站的get the ssh2 library。或者,PEAR package也支持SSH2。
  • 安装完成后,您可以阅读ssh2 documentation设置隧道。
  • 在您的脚本中,您可以设置隧道。
  • 在脚本中设置隧道后,您可以指定CURL代理。
  • 执行CURL操作。
  • 释放隧道资源并关闭脚本中的连接。

我不是PHP专家,但这是一个粗略的例子:

<?php
$connection = ssh2_connect(ip-address-of-ssh-server, 22);
ssh2_auth_pubkey_file($connection, 'username', 'id_dsa.pub', 'id_dsa');
$tunnel = ssh2_tunnel($connection, '127.0.0.1', 9999);
curl_setopt($ch, CURLOPT_PROXY, ‘127.0.0.1:9999'); 
// perform curl operations

// The connection and tunnel will die at the and of the session.
?>

最简单的选项

另一个需要考虑的选择是使用sftp(ftp over ssh)而不是CURL ...这可能是在PHP中安全地将文件从一台服务器复制到另一台服务器的推荐方法......

更简单的例子:

<?php
$connection = ssh2_connect(ip-address-of-ssh-server, 22);
ssh2_auth_password($connection, 'username', 'password');
ssh2_scp_send($connection, '/local/filename', '/remote/filename', 0644);
?>

答案 1 :(得分:2)

根据manpage -D确实创建了一个socks代理。

-D [bind_address:]port
             Specifies a local ``dynamic'' application-level port forwarding.
             This works by allocating a socket to listen to port on the local
             side, optionally bound to the specified bind_address.  Whenever a
             connection is made to this port, the connection is forwarded over
             the secure channel, and the application protocol is then used to
             determine where to connect to from the remote machine.  Currently
             the SOCKS4 and SOCKS5 protocols are supported, and ssh will act
             as a SOCKS server.  Only root can forward privileged ports.  Dy-
             namic port forwardings can also be specified in the configuration
             file.

答案 2 :(得分:0)

您可以使用ssh2模块和ssh2_tunnel函数来创建远程服务器的ssh隧道。 可用示例:http://www.php.net/manual/en/function.ssh2-tunnel.php

答案 3 :(得分:0)

请参阅我对Qwerty建议的解决方案的评论。我认为你正在寻找错误的方向试图解决这个问题。相反,您应该只使用cURL并为自己创建个人证书。你说你想用SSH来保证安全,但为什么不用证书呢?

此网站将让您轻松创建一个 http://www.cacert.org/

由于它只适合您,您可以在浏览器中添加例外,这样他们就不会抱怨错误的证书。不需要ssh!

答案 4 :(得分:0)

要仅在脚本持续时间内打开SSH隧道,您可能需要使用PHP forks。在一个过程中,打开SSH隧道(-D - 您需要做一些工作以确保您没有在端口上发生冲突),而在另一个过程中,将CURL与socks proxy config一起使用。传输完成后,请发信号通知ssh fork终止,以免连接断开。

请记住,当隧道打开时,同一台计算机上的其他用户也可以根据需要在该端口上进行代理。考虑到这一点,使用-L 1234:remotehost:80标志可能是个更好的主意,只需获取URL http://localhost:1234/some/uri

如果出现问题,您可能会在服务器上找到孤立的SSH隧道,所以我会称之为脆弱。