「SSH 黑魔法」: 代理、端口转发和 shell 共享

在好朋友的推荐下,我看了这个视频: 

The Black Magic Of SSH

这个视频里面,介绍了  ssh 的一些高级应用;结合工作的经历,两类问题会对我们平时的工作帮助很大:

 

1. 两个人怎么看同一个终端界面

2. 怎样用一台服务器做端口转发

 

Shell 共享

你可以把这个问题看成一个字符版的 vnc 或者 RDP,比如你的机器遇到了一个问题,但是又想看一下大牛是如何处理的;或者你需要别人手把手的想你演示一些东西,这个时候需要你和大牛同时看到同一个 shell 终端。

 

严格地说这个解决方式不是 ssh 自己的功劳了,安装一个 tmux (screen) 就可以轻松解决这个问题。

 

简单的步骤如下:

1. 用户A 连接到一台 ssh 主机上,然后输入 tmux,创建一个 session

2. 用户B 链接到相同的主机上,输入 tmux attach, 打开用户A 创建的 session

 

这样 A、B两个用户现在就拥有了一个 全双工 的 终端了: 两个人的输入、屏幕上显示的内容完全是同步的; 当然,为了你们两个不至于打起来,还是把它当作半双工的使用才好。

 

Socks5 proxy

“Across the Great Wall we can reach every corner in the world.”

这是一个比较敏感的话题,我就看在你是为了访问 google scholarship 和 python.org 的份上,继续往下写好了。

很多人都会有一个 vps 来搭建个人的 blog,这样可以使用 ssh 来很方便的搭起一个 socks5 proxy。

 

在终端里输入

man ssh

找到其中的“-D” 部分, 你可以看到以下解释:它会在主机上占用指定的端口,然后任何一个连接到它的链接,都会通过主机转发出去,并且目前只支持 socks4、sucks5 协议。

所以你可以这样连接一台服务器:

ssh -D 8888 user@hostname

然后你就拥有了一个私人的 socks5 proxy, 地址就是你主机的地址,端口就是 -D 后面的参数了。

 

端口转发

就像 640k 内存就够一台电脑足够使用一样,IPV4 也是足够使用的;所以我们有了 NAT 这个东西。随后来了两类问题:

 

1. 我们公司有一台对外的机器,和N台对内的机器,怎样让其他用户,可以直接访问内网机器的某个/些端口

2. 我有一台公网的主机,家里有一台机器(在移动或者长宽的后面),怎样让别人能连到我家里的电脑上去

 

把本机的请求转发到远程主机: SSH -L

 L 就是 local 的意思,使用 -L 参数,可以把发往本机的请求转发到其他地址上面去。

比如我厂有两台机器,一台机座O,是可以通过外网访问的;另外一台记作 I,是躲在防火墙后面,但是 O I 之间,是畅通无阻的。这时候你在I上运行了一个服务,想让大家可以访问,又没有权限更改管理员对防火墙的设定,那么 -L 就可以拯救你了: 在O与I之间,做一个端口转发; 凡是发往 O:port 的请求,都会被转发到 I:port_1 上面去。

 

-L 后面支持三个参数:

-L [bind_address:]port:host:hostport

 

port: 本地端口

host: 把发往本地的端口,转发到哪台主机上

hostport: 转发的端口号。

 

如果我们想把发往 ip1 8000端口的请求,全部转发到 ip2 80端口上面去,可以在 ip1 的主机上,建立这样一个连接:

ssh -L 8000:ip2:80 user@hostname

事情就这样成了!

 

如果你舍得多花些心思,你会发现, ssh 后面的hostname,不一定需要是 ip1,也是可以转发的

 

把发往主机的请求转发到本地:SSH -R

如果你了解了 -L 的使用,那么 -R 自然也很容易理解了,就是反过来,把发往主机的请求,转发回本地;这个方式很适用于处在各个内网的用户。

 

我的朋友 S 小姐,公司最近给她发了一个 rMBP,用来为公司录制的视频进行格式转换; 显然是 ffmpeg 大显身手的时候。其实我说的是我,因为她不太会用cli来使用 ffmpeg。不过她很不幸的选择了长宽,外面的链接,无论如何也不能主动连接过去;想在QQ上介绍怎么 ffmpeg 怎么使用也是不太容易的事情。如果能够直接 ssh 到她的机器上,就可以直接操作了。这个时候,就用到 -S 来把远程的数据向本地转发了。

 

-R 的参数,和 -L 类似

 

-R [bind_address:]port:host:hostport

会把发往主机 port 端口的请求,转发到 host的 hostport 端口上,所以如果你想让其他人访问你的电脑,可以这么做:

ssh -R 8000:127.0.0.1:80 uesr@hostname

这个时候,任何发往 hostname:8000 的请求,都会被转发到 127.0.0.1:80 上来。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。