我目前正在运行一堆:
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
选项。每次都有不同的端口。
正是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
当然,如果您有许多不同的主机/端口可以转发到某些特定的主机/端口,那么没有什么可以阻止您将其包装到脚本中或自动化它。
希望这可以帮助。
您可以使用以下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}
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
对于通过同一主机转发多个端口的人,可以在〜/ .ssh / config中设置类似这样的内容
127.0.0.1:16000~16009
它变成了一个简单的hostname:6000~6009
。
我已经开发了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
使用端口转发登录服务器的好处之一是便于使用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可以相同,以简化过程。
你可以使用这个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[@]"
}