![从一个 SSH 连接建立隧道到另一个 SSH 连接](https://linux22.com/image/1283057/%E4%BB%8E%E4%B8%80%E4%B8%AA%20SSH%20%E8%BF%9E%E6%8E%A5%E5%BB%BA%E7%AB%8B%E9%9A%A7%E9%81%93%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%20SSH%20%E8%BF%9E%E6%8E%A5.png)
我有一台ic
可以 ssh 连接的机器,名为 。还有另一台机器,fw
,位于完全不同的 VLAN 上,我无法与它通信。ic
位于我的两个 VLAN 上和使用的VLAN fw
,因此我通常通过 ssh 连接到 fw 的程序是 ssh 进入ic
,然后从那里 ssh 进入fw
。但是,如果我想编写此操作的脚本,我该如何让它工作?
我尝试过ssh root@ic "ssh root@fw"
,但这会导致消息Pseudo-terminal will not be allocated because stdin is not a terminal
,然后我收到三条来自的消息fw
,大概是因为它有空输入:
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).
编写该脚本的最佳方法是什么?
答案1
默认情况下,ssh
在发出命令时不分配 pty。对于交互式使用,您可以使用选项覆盖此-t
设置。
对于身份验证,如果您使用公钥和正确配置的ssh-agent
,您可以使用该-A
选项来启用代理转发。
ssh -t -A user@ic ssh root@fw
(使用根到处都有?别偷懒,赶紧创建账户吧。)
另一种方法,使用 SSH 上的 TCP 转发:
首先建立连接到ic
使用-L
(本地隧道)选项:
ssh -L 7890:fw:22 -fN user@ic
现在所有连接到localhost:7890
将通过ic
到fw:22
(端口 7890 是任意的;您可以选择任何您喜欢的未使用的端口。)
(该-fN
选项将使该连接在后台继续运行。)
二、通过隧道连接:
ssh root@localhost -p 7890
答案2
其他方法是使用ProxyCommand
:
ssh root@fw -o "ProxyCommand=ssh root@ic nc $FW_VLAN_IP %p"
这将连接到ic
,创建一个 netcat TCP 代理并将fw
其借给您的本地ssh
客户端,这意味着它将使用您的本地身份验证系统而不是远程身份验证系统。