我目前正在运行一堆:

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

那已经很有帮助了。

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


当前回答

正是NaN回答的,您指定了多个-L参数。我一直都这么做。下面是一个多端口转发的例子:

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

注意:如果不指定localhost,则此值与-L localhost:8822:REMOTE_IP_1:22相同。

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

ssh localhost -p 8822

,在22号端口上连接REMOTE_IP_1

和类似的

ssh localhost -p 9922

,在22号端口上连接REMOTE_IP_2

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

其他回答

你可以使用这个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语法糖。

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

首先,可以通过xargs -P 0实现并行执行。

创建一个绑定端口的文件。

localhost:8080:localhost:8080
localhost:9090:localhost:8080

然后运行

xargs -P 0  -I xxx ssh -vNTCL xxx <REMOTE>  < port-forward

或者你也可以用一句话

echo localhost:{8080,9090} | tr ' ' '\n' | sed 's/.*/&:&/' | xargs -P 0 -I xxx ssh -vNTCL xxx <REMOTE>

pros独立的ssh端口转发,它们是独立的==避免单点故障 缺点:每个SSH端口转发是分开分叉的,在某种程度上效率不高


其次,可以使用bash中的花括号展开特性来完成

echo "ssh -vNTC $(echo  localhost:{10,20,30,40,50} | perl -lpe 's/[^ ]+/-L $&:$&/g') <REMOTE>"
# output
ssh -vNTC -L localhost:10:localhost:10 -L localhost:20:localhost:20 -L localhost:30:localhost:30 -L localhost:40:localhost:40 -L localhost:50:localhost:50 <REMOTE>

真实的例子

echo "-vNTC $(echo localhost:{8080,9090} | perl -lpe 's/[^ ]+/-L $&:$&/g') gitlab" | xargs ssh

转发8080和9090到gitlab服务器。

优点:单叉==高效 通过关闭这个进程(ssh),所有转发都被关闭==单点故障

正是NaN回答的,您指定了多个-L参数。我一直都这么做。下面是一个多端口转发的例子:

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

注意:如果不指定localhost,则此值与-L localhost:8822:REMOTE_IP_1:22相同。

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

ssh localhost -p 8822

,在22号端口上连接REMOTE_IP_1

和类似的

ssh localhost -p 9922

,在22号端口上连接REMOTE_IP_2

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

另一个我在debian上使用的内衬:

ssh user@192.168.1.10 $(for j in $(seq 20000 1 20100 ) ; do  echo " -L$j:127.0.0.1:$j " ; done | tr -d "\n")