我目前正在运行一堆:

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

那已经很有帮助了。

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


当前回答

您可以使用以下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}

其他回答

您可以使用以下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}

对于通过同一主机转发多个端口的人,可以在~/.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全端口转发。

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

这是一个受到尤瓦尔·阿兹蒙启发的解决方案。

与最初的解决方案相比,它有一些好处:

首先,它创建一个单独的后台进程,而不是每个端口一个进程 它生成别名,允许您终止隧道 它只绑定到127.0.0.1,这更安全一些

你可以这样使用它:

你的电话。 tnl your.remote.com (124,1235) 你的地址。

最后用tnlkill杀死他们。

function tnl {
  TUNNEL="ssh -N "
  echo Port forwarding for ports:
  for i in ${@:2}
  do
    echo " - $i"
    TUNNEL="$TUNNEL -L 127.0.0.1:$i:localhost:$i"
  done
  TUNNEL="$TUNNEL $1"
  $TUNNEL &
  PID=$!
  alias tnlkill="kill $PID && unalias tnlkill"
}

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

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