ssh -L转发多个端口

问题描述 投票:72回答:7

我目前正在运行一堆:

sudo ssh -L PORT:IP:PORT root@IP

其中IP是安全机器的目标,PORT代表我转发的端口。

这是因为我使用了许多我没有这种转发无法访问的应用程序。执行此操作后,我可以通过localhost:PORT访问。

现在出现的主要问题是我实际上有4个这样的端口我必须转发。

我的解决方案是打开4个shell并不断向后搜索我的历史记录以查找需要转发的确切端口等,然后运行此命令 - 每个shell中一个(必须填写密码等)。

如果我能做的事情如下:

sudo ssh -L PORT1+PORT2+PORT+3:IP:PORT+PORT2+PORT3 root@IP

那真的会有所帮助。

有没有办法让它更容易做到这一点?

ssh port portforwarding
7个回答
141
投票

在同一命令中再次使用-L选项。每次都有不同的端口。


68
投票

正是NaN回答的问题,你指定了多个-L参数。我一直这样做。以下是多端口转发的示例:

ssh remote-host -L 8822:REMOTE_IP_1:22 -L 9922:REMOTE_IP_2:22

注意:如果您未指定 -L localhost:8822:REMOTE_IP_1:22,则与localhost相同。

现在有了这个,你现在可以(从另一个终端)做:

ssh localhost -p 8822

连接到REMOTE_IP_1港口的22

和类似的

ssh localhost -p 9922

连接到REMOTE_IP_2港口的22

当然,如果您有许多不同的主机/端口可以转发到某些特定的主机/端口,那么没有什么可以阻止您将其包装到脚本中或自动化它。

希望这可以帮助。


18
投票

您可以使用以下bash函数(只需将其添加到~/.bashrc):

function pfwd {
  for i in ${@:2}
  do
    echo Forwarding port $i
    ssh -N -L $i:localhost:$i $1 &
  done  
}

用法示例:

pfwd hostname {6000..6009}

7
投票

jbchichoko和yuval给出了可行的解决方案。但是jbchichoko的回答并不是一个灵活的答案作为一个函数,并且yuval的答案打开的隧道不能被ctrl+c关闭,因为它在后台运行。我在下面给出了我的解决方案,解决了两个缺陷:

在qazxsw poi或qazxsw poi中定义一个函数:

~/.bashrc

运行该函数的示例:

~/.zshrc

这个例子的结果:

你可以像# fsshmap multiple ports function fsshmap() { echo -n "-L 1$1:127.0.0.1:$1 " > $HOME/sh/sshports.txt for ((i=($1+1);i<$2;i++)) do echo -n "-L 1$i:127.0.0.1:$i " >> $HOME/sh/sshports.txt done line=$(head -n 1 $HOME/sh/sshports.txt) cline="ssh "$3" "$line echo $cline eval $cline } 一样访问fsshmap 6000 6010 hostname


2
投票

对于通过同一主机转发多个端口的人,可以在〜/ .ssh / config中设置类似这样的内容

127.0.0.1:16000~16009

它变成了一个简单的hostname:6000~6009


0
投票

我已经开发了Host all-port-forwards Hostname 10.122.0.3 User username LocalForward PORT_1 IP:PORT_1 LocalForward PORT_2 IP:PORT_2 LocalForward PORT_3 IP:PORT_3 LocalForward PORT_4 IP:PORT_4来帮助ssh转发。它可用于在相同端口本地远程共享端口5000和7000:

ssh all-port-forwards

0
投票

使用端口转发登录服务器的好处之一是便于使用Jupyter Notebook。这个loco提供了一个很好的描述如何。在这里,我想为你们所有人做一些总结和扩展。

情况1.从名为Host-A的本地计算机(例如您自己的笔记本电脑)登录到名为Host-B的远程工作计算机。

pip install loco

loco listen SSHINFO -r 5000 -r 7000

然后你可以打开一个浏览器并输入:link来做你在Host-B上的工作,但是在Host-A中看到它。

情况2.从名为Host-A的本地计算机(例如您自己的笔记本电脑)登录到名为Host-B的远程登录计算机,然后从该计算机登录到名为Host-C的远程工作计算机。这通常是大学内大多数分析服务器的情况,可以通过使用与ssh user@Host-B -L port_A:localhost:port_B jupyter notebook --NotebookApp.token='' --no-browser --port=port_B 连接的两个http://localhost:port_A/来实现。

ssh -L

然后你可以打开一个浏览器并输入:-t来做你在Host-C上的工作但是在Host-A中看到它。

情况3.从名为Host-A的本地计算机(例如您自己的笔记本电脑)登录到名为Host-B的远程登录计算机,然后从该计算机登录到名为Host-C的远程工作计算机,最后登录到远程工作计算机Host- D.通常情况并非如此,但有时可能会发生。它是情境2的扩展,同样的逻辑可以应用于更多的机器上。

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C
jupyter notebook --NotebookApp.token='' --no-browser --port=port_C

然后你可以打开一个浏览器并输入:http://localhost:port_A/来做你在Host-D上的工作但是在Host-A中看到它。

请注意,port_A,port_B,port_C,port_D可以是随机数,除了列出的常用端口号ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C -t ssh -L port_C:localhost:port_D user@Host-D jupyter notebook --NotebookApp.token='' --no-browser --port=port_D 。在情境1中,port_A和port_B可以相同,以简化过程。


-1
投票

你可以使用这个zsh函数(可能也适用于bash)(把它放在http://localhost:port_A/中):

here

例子:

~/.zshrc

ashL () { local a=() i for i in "$@[2,-1]" do a+=(-L "${i}:localhost:${i}") done autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -NT "$1" "$a[@]" }

© www.soinside.com 2019 - 2024. All rights reserved.