我需要找到一种方法,通过具有公共 IP 的服务器将文件从位于专用 NATted 网络上的mymachine
服务器复制。 NAT 后面的机器只有 的证书,因此需要将证书从via转发到priv-server
pub-server
priv-server
user@mymachine
mymachine
pub-server
priv-server
因此,为了仅使用一个命令即可通过 SSH 登录,我使用:
$ ssh -tA user@pub-server 'ssh user@priv-server'
——这效果非常好。证书从via转发mymachine
到,一切都设置得很好。priv-server
pub-server
现在,我通常会用于scp
任何文件传输需求,但我不知道如何将所有隧道信息传递到scp
.
答案1
相反,使用更低级的形式来复制文件,方法是cat
在本地复制文件,并将其通过管道传输到远程cat > filename
命令中priv-server
:
$ cat file1.txt | ssh -A user@pub-server 'ssh user@priv-server "cat > file1.txt"'
或压缩:
$ gzip -c file1.txt | ssh -A user@pub-server 'ssh user@priv-server "gunzip -c > file1.txt"'
摘自man ssh
:
-A 启用身份验证代理连接的转发。这也可以在配置文件中针对每个主机进行指定。
-t 强制伪 tty 分配。这可用于在远程计算机上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。多个 -t 选项强制 tty 分配,即使 ssh 没有本地 tty。
我最初不知道答案,但经过一夜好眠并写下这个问题后,我发现我最初尝试的命令存在问题,修复了它,并且成功了。但由于这似乎是一件有用的事情,所以我决定分享答案。
答案2
如果您尝试使用本机,这会很简单sshfs这是最近添加的。
安装sudo apt-get install sshfs
sshfs -ttA user@pub-server ssh user@priv-server
这会发挥魔法。
欲了解更多信息,请参阅此处Linux 杂志
答案3
不要想知道如何处理复杂的 SSH 转发链,而是将问题分开。
配置您的系统以透明访问每个主机。这是在您的操作中一劳永逸地完成的
~/.ssh/config
文件。教 SSH使用一台机器作为另一台机器的代理,声明一个
ProxyCommand
.Host priv-server User user ProxyCommand ssh -W %h:%p -t user@pub-server
还启用连接共享。这允许多个客户端实例使用同一通道,从而节省连接建立时间。在顶部
.ssh/config
(任何行之前Host
)添加ControlMaster auto ControlPath ~/.ssh/control:%h:%p:%r
如果可以,请设置密钥身份验证和代理转发,以便身份验证完全透明。如果不能,那么您需要在某些主机上进行交互式身份验证,只需每个会话或在网络故障后进行一次身份验证。打开主连接。
ssh -Nf priv-server
正常调用
ssh
(或scp
、sftp
、sshfs
、rsync
等)。