我经常遇到这样的情况:我必须对远程主机进行多次跳转,只是因为我的客户端和远程主机之间没有直接路由。当我需要从两跳或更多跳转的远程主机复制文件时,我总是必须:
client$ ssh host1
host1$ ssh host2
host2$ scp host3:/myfile .
host2$ exit
host1$ scp host2:myfile .
host1$ exit
client$ scp host1:myfile .
当 uucp 仍在使用时,这将像
uucp host1!host2!host3 /myfile .
我知道有 uucp over ssh,但不幸的是我没有在这些机器上设置它的适当权限。另外,我不确定我是否真的想摆弄客户的机器。
有谁知道有一种方法可以完成这些任务,而不需要设置大量隧道或向远程主机部署新软件?也许是某种递归脚本,它可以将自身克隆到所有远程主机,为我完成艰苦的工作?
假设使用公钥进行身份验证,并且所有主机都执行 SSH 代理转发。
编辑:我并不是在寻找一种自动将我的交互式会话转发到下一跳主机的方法。我想要一种解决方案,使用 scp 通过多跳复制文件 bangpath 样式,而无需在任何这些机器上安装 uucp。我没有(合法)权利或特权对 ssh-config 进行永久更改。此外,我与许多其他人共享此用户名和主机。我愿意破解自己的脚本,但我想知道是否有人知道已经这样做了。对 bangpath 上的主机进行最小侵入性更改,从客户端进行简单调用。
编辑 2:为了让您了解在交互式会话中如何正确执行此操作,请查看GXPC集群壳。这基本上是一个 Python 脚本,它会将自身传播到所有具有连接性且安装了 ssh 密钥的远程主机。它的优点在于,您可以告诉“我可以通过 HostB 通过 HostA 访问 HostC”。它就是有效。我想要这对于 scp。
答案1
即使您明确提到这不是您想要的,我也会坚持让您尝试一下,因为在到达目的地的路径上的每个主机上设置脚本更加复杂且耗时。
如果您在主机笔记本电脑上并且希望将某些内容复制到主机网络服务器,但您只能通过 companygatweay.org 访问网络服务器,那么您需要做的就是:
laptop$ ssh -L4444 companygateway.org:webserevr:22
这将在您的本地计算机上打开端口 4444,直接连接到端口 22 上的 Web 服务器。
使用 scp 复制到网络服务器如下所示:
laptop$ scp -P 4444 /some/files/here localhost:/to/some/files/on/webserver
从网络服务器复制:
laptop$ scp -P 4444 localhost:/tmp/remote/files /home/localusername/downloads
答案2
ssh host1 ssh host2 ssh host3 cat /myfile > myfile
? :)
更新。(2014-01-20):最近我偶然看到man dbclient
其中提到:“……
-B endhost:endport — “Netcat 类似”模式,Dropbear 将连接到指定主机,然后创建到 endhost 的转发连接。这将作为 dbclient 的标准输入/输出呈现。
Dropbear 还允许指定多个“跳转”,以逗号分隔。在这种情况下,将连接到第一台主机,然后通过该主机与第二台主机建立 TCP 转发连接,依此类推。除最终目的地之外的主机将看不到加密的 SSH 流以外的任何内容。可以使用斜线指定主机的端口(例如 matt@martello/44 )。此语法也可以与 scp 或 rsync 一起使用(将 dbclient 指定为 ssh/rsh 命令)。文件可以通过多个 SSH 跳转“反弹”,例如
scp -S dbclient matt@martello,root@wrt,canyons:/tmp/dump .
请注意,在上面的示例中,主机名由前一跳解析(因此“canyons”将由主机“wrt”解析),与其他 -L TCP 转发主机的方式相同。根据给定的主机名在本地检查主机密钥。
答案3
如果您的 scp 版本来自较新的 openssh 版本,那么您可以使用 ProxyJump 选项:scp -o Proxyjump=firsthop.example.com,secondhop.example.com /path/to/file destination.example.com:/where/to/put/it
这依赖于将一个 ssh 连接转发到另一个 ssh 连接,但以瞬时方式转发,而不是设置监听端口。因此,除了 sshd 允许连接到远程端口之外,它不需要在中间主机上进行任何特殊设置。