我目前正在运行一堆:
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相同
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相同
使用端口转发登录到服务器的好处之一是方便使用Jupyter Notebook。这个链接提供了如何使用它的极好描述。在这里,我想做一些总结和拓展,供大家参考。
情况1。从一台名为Host-A的本地机器(例如您自己的笔记本电脑)登录到一台名为Host-B的远程工作机器。
ssh user@Host-B -L port_A:localhost:port_B
jupyter notebook --NotebookApp.token='' --no-browser --port=port_B
然后,您可以打开浏览器并输入:http://localhost:port_A/在主机- b上进行工作,但在主机- a中看到它。
情况2。从一台名为Host-A的本地机器(例如您自己的笔记本电脑)登录到一台名为Host-B的远程登录机器,然后从那里登录到名为Host-C的远程工作机器。这通常是大学内大多数分析服务器的情况,可以通过使用两个ssh -L连接-t来实现。
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-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 -t ssh -L port_C:localhost:port_D user@Host-D
jupyter notebook --NotebookApp.token='' --no-browser --port=port_D
然后,您可以打开浏览器并输入:http://localhost:port_A/在Host-D上进行工作,但在Host-A中看到它。
注意:port_A、port_B、port_C、port_D可以是除常见端口号外的随机数。在情况1中,port_A和port_B可以相同,以简化过程。