我正在尝试找到一种即时方法,通过服务器 A 连接防火墙后面的服务器 B,并在服务器 B 和我的笔记本电脑之间交换文件。
正常情况下,ssh登录流程是这样的。
- 我的笔记本电脑->中间人:
mylaptop: ssh myUser@ServerA
(密码验证)
- 中间人->目的地:
ServerA: sudo -u sharedUser ssh ServerB
(无密码)
我必须使用受限帐户登录服务器 A我的用户首先,切换我的用户到共享用户在服务器 A 上,因为只有共享用户我有服务器 B 的密钥。我没有服务器 B 的密钥,也没有权限使用 myUser 进行读写服务器 A。
我已经尝试过OpenSSH/Cookbook/代理和跳转主机,但是它不起作用,因为服务器 A 的 myUser 没有用于登录服务器 B 的密钥(服务器 A 上的 sharedUser 有)。
ssh sudo su ssh
Me -----------> myUser@A ---------> sharedUser@A -----------> B
^ ^ ^
password switch user using sharedUser@A's
authentication ssh key
问题:
我想知道是否有办法通过 SSH 代理“直接”连接到服务器 B,或者其他方法?
有没有一种方法可以通过多次跳转和用户名更改,使用 SFTP/SCP 等与服务器 B 远程交换文件?
谢谢!
答案1
你可以像这样mylaptop
运行命令: 。所以这应该是可能的:ServerA
ssh myUser@ServerA some_command
ssh -t myUser@ServerA sudo -u sharedUser ssh ServerB
通常情况下ssh
,运行的程序some_command
不会分配伪终端,它只会传递 stdin、stdout 和 stderr。如果您想要像ssh ServerB
在 上手动输入一样进行交互ServerA
,则需要伪终端。因此-t
。
sudo
如果“内部”ssh
要求输入密码,伪终端也会很有用。
您说您想传输文件。“内部”ssh
可以在 上运行命令,ServerB
就像“外部”ssh
在 上运行命令一样ServerA
。命令可能是cat
,文件可以通过这种方式传输(流式传输)。在这种情况下,您不应该使用-t
,它只会破坏流。幸运的是,您不需要密码,因此使用与否sudo -u sharedUser ssh ServerB
没有冲突。-t
要从中提取文件ServerB
:
>/local/file ssh myUser@ServerA sudo -u sharedUser 'ssh ServerB "cat </server/b/path/to/file"'
要将文件推送至ServerB
:
</local/file ssh myUser@ServerA sudo -u sharedUser 'ssh ServerB "cat >/server/b/path/to/file"'
cat
正确的引用对于在影响cat
(不是ssh
或)之后进行重定向非常重要sudo
。