我目前正在运行一堆:

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

那已经很有帮助了。

有什么方法能让这一切变得更容易吗?


当前回答

-L选项可以在同一个命令中指定多次。每次都有不同的端口。例如ssh -L localPort0:ip:remotePort0 -L localPort1:ip:remotePort1…

其他回答

对于通过同一主机转发多个端口的人,可以在~/.ssh/config中设置类似的东西

主机all-port-forwards 主机名10.122.0.3 用户的用户名 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全端口转发。

在我的公司,我和我的团队成员都需要访问一个不可达的“目标”服务器的3个端口,所以我创建了一个从可达服务器到目标服务器的永久隧道(这是一个可以无限期在后台运行的隧道,参见params -f和-N)。在可访问服务器的命令行上执行:

ssh root@reachableIP -f -N  -L *:8822:targetIP:22  -L *:9006:targetIP:9006  -L *:9100:targetIP:9100

我用的是root用户,但你自己的用户也可以。您必须输入所选用户的密码(即使您已经使用该用户连接到可达服务器)。

现在,可访问机器的8822端口对应于目标机器的22端口(对于ssh/PuTTY/WinSCP),可访问机器上的9006和9100端口对应于目标机器的相同端口(在我的例子中,它们承载两个web服务)。

我开发了loco来帮助ssh转发。它可以用于共享端口5000和7000在远程本地相同的端口:

pip install loco

loco listen SSHINFO -r 5000 -r 7000

你可以使用这个zsh函数(可能也适用于bash)(把它放在~/.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[@]"
}

例子:

ashL db@114.39.161.24 6480 7690 7477

ashL db@114.39.161.24 {6000..6050} #转发整个范围这只是shell语法糖。

如果你想要一个简单的解决方案,在后台运行,很容易杀死-使用控制套接字

# start
$ ssh -f -N -M -S $SOCKET -L localhost:9200:localhost:9200 $HOST
# stop
$ ssh -S $SOCKET -O exit $HOST