我目前正在运行一堆:

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

那已经很有帮助了。

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


当前回答

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

在~/中定义函数。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

本例的结果:

您可以访问127.0.0.1:16000~16009,与主机名:6000~6009相同

其他回答

另一种方法是使用-D标志告诉ssh作为SOCKS代理工作。

这样,只要客户端应用程序能够通过SOCKS代理(或使用类似socksify的东西),您就能够连接到通过ssh服务器访问的任何远程网络地址/端口。

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

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

首先,可以通过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),所有转发都被关闭==单点故障

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

pip install loco

loco listen SSHINFO -r 5000 -r 7000

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

在~/中定义函数。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

本例的结果:

您可以访问127.0.0.1:16000~16009,与主机名:6000~6009相同