我正在尝试通过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和代理发送文件?
答案 0 :(得分:0)
您需要一个知道如何与SOCKS代理通信的实用程序。例如socat
。
您需要做的第一件事是找出如何调用该实用程序,以便通过代理建立到SFTP服务器的连接。它应该是这样的:
socat stdio SOCKS4:proxy_server:sftp_server:22
其中proxy_server
和sftp_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']);