Perl Net SFTP外部代理

时间:2014-06-11 22:41:27

标签: perl proxy sftp

我正在尝试通过sftp连接到客户端计算机,并通过Perl Net::SFTP::Foreign将文件放在那里。我已经看到很多关于如何做到这一点的例子,但没有一个涉及使用 socks代理

背景 对于标准Net::FTP,我可以使用IO Socket Wrapper,并且所有内容都会被代理:

use IO::Socket::Socks::Wrapper({
    ProxyAddr  => 'my.proxy.address',
    ProxyPort  => 1080,
    SocksDebug => 1 #enable for debugging
});

但是,这对Net :: SFTP :: Foreign不起作用。所以,我正在尝试解决这个问题。

if ($sftp = Net::SFTP::Foreign->new("ftp.myserver.com",
   user      => "ftpusername",
   password  => "ftpuserpwd",
   more      => [-o => 'ProxyCommand=ssh -D 1080 my.proxy.address'],
))
{
     some code that runs when successful auth...
}

......我在Perl Monks上找到了上述内容,但它似乎没有帮助。以下是Perl Monks解释此问题的网址:http://www.perlmonks.org/?node_id=938019

我认为关键是使用正确的ProxyCommand,但我不确定这是否正确。

有谁知道如何通过sftp和代理发送文件?

1 个答案:

答案 0 :(得分:0)

您需要一个知道如何与SOCKS代理通信的实用程序。例如socat

您需要做的第一件事是找出如何调用该实用程序,以便通过代理建立到SFTP服务器的连接。它应该是这样的:

 socat stdio SOCKS4:proxy_server:sftp_server:22

其中proxy_serversftp_server分别是代理和SFTP服务器的名称。

您知道何时正确执行该操作是因为您从SSH服务器获取了版本字符串,类似于SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2

然后,您只需将命令传递给Net :: SFTP :: Foreign构造函数,如下所示:

$sftp=Net::SFTP::Foreign->new("ftp.myserver.com",
                              user     => "ftpusername",
                              password => "ftpuserpwd",
                              more     =>
                                  [-o=>'ProxyCommand=socat stdio SOCKS4:$proxy_server:ftp.myserver.com:22']);