使用 Net::SFTP::Foreign 的 OpenSSH 后端时,代理路由可以写成一个 SSH 选项。该模块文档中记录的 more 参数接受一个命令参数数组:

use Net::SFTP::Foreign;

my $sftp = Net::SFTP::Foreign->new(
    'files.example.net',
    user => 'operator',
    more => [
        '-o',
        'ProxyCommand=nc -X 5 -x proxy.example.net:1080 %h %p',
    ],
);

die $sftp->error if $sftp->error;

这假定已经有一个兼容 OpenBSD 的 nc 辅助程序。OpenSSH 会在本地运行它,以建立到 SFTP 目标的 SOCKS5 连接。占位符提供 SSH 选定的主机和端口。要经过允许的公共中转访问公共 SFTP 服务器,请为这个辅助程序从SOCKS5 代理列表中选一个无需账号的端点;它必须放行该 SSH 目标和端口。

参数的边界很关键:-o 是一个参数,整个 ProxyCommand 赋值是下一个参数。Net::SFTP::Foreign 的 more 参数不会自动把包含多个 SSH 参数的任意字符串当作数组。

应用也可以把 ProxyCommand 留在常规的 SSH Host 配置里,再把该主机别名交给 Net::SFTP::Foreign。两种形式都可以使用 OpenSSH 后端的配置;Plink 等不同后端有自己的选项语法。

相关文章