Skip to content

Instantly share code, notes, and snippets.

@wfxr
Last active November 15, 2017 10:28
Show Gist options
  • Save wfxr/e36cf3068e3826a5b1ea2f0c6d64fe65 to your computer and use it in GitHub Desktop.
Save wfxr/e36cf3068e3826a5b1ea2f0c6d64fe65 to your computer and use it in GitHub Desktop.
Linux commands

基本参数

正向代理

ssh -fCNL

反向代理

ssh -fCNR

参数含义

-f 后台执行
-C 允许数据压缩
-N 不执行远程执行
-R 将远程主机的端口转发到本地机器的端口
-L 将本地机器的端口转发到远程主机的端口
-p 指定要连接的远程主机端口

SSH代理访问数据库


A: 本地机器,可访问代理机器B

B: 代理机器,可访问远程数据库C

C: 远程数据库,限制由代理机器B访问

ssh -fCNL <portA>:<hostC>:<portC> userB@hostB
mysql -h 127.0.0.1 -P <portA> -u <dbUser> -p    # NOTE: 这里的127.0.0.1一般不能用localhost代替

portA: 本地未占用的某个端口

hostC: C服务器IP或域名

portC: C服务器数据库端口

userB: B服务器用户

hostB: B服务器IP或域名

SSH隧道


如果C是一台内网的服务器,只能由B访问,可通过将本地端口通过B映射到C的ssh端口(22或其他)建立ssh隧道

ssh -fCNL <portA>:<hostC>:22 user@hostB 
ssh -p <portA> localhost                  # 从A登录C(localhost和127.0.0.1均可)
scp -P <portA> <fileA> localhost:<pathC>  # 拷贝本地文件到C

SSH反向隧道


公网跳转

A: 局域网内的机器,可访问公网,但没绑定公网IP

B: 公网机器

在局域网机器A上面安装并运行ssh-server服务(如openssh-server),然后执行

ssh -fCNR <portB>:localhost:22 <userB>@<hostB>

公网机器B上执行

ssh <userA>@localhost -p <portB>

即可连接到内网机器A

公网代理

在完成公网跳转配置的基础上,在公网机器B上面执行

ssh -fgNL <portBB>:localhost:<portB> localhost

<portBB>端口映射到B本地的<portB>端口,即代理局域网机器A的反向隧道端口。

接下来就可以直接在任意一台公网机器C上执行

ssh <userB>@<hostB> -p <portBB>

就可以直接登录到内网机器A

自动重连

在公网跳转设置环节,将命令

ssh -fCNR <portB>:localhost:22 <userB>@<hostB> -p22

修改为

autossh -M <portA> -fCNR <portB>:localhost:22 <userB>@<hostB>

即可, 上面的是autossh的监视进程,当通道端口时,会自动执行重连

开机自动启动

将上述autossh命令daemon加入内网机器的系统启动项。

脚本的写法有两种,一是 类似ssh,通过autossh指定用户.ssh的路径,二是以用户的方式执行daemon。

方式二脚本如下:

/bin/su -c '/usr/bin/autossh -M <portA> -fCNR <portB>:localhost:22 <userB>@<hostB>' - userA

将脚本autossh.sh放入/etc/init.d/,执行

sudo chmod +x /etc/init.d/autossh.sh
sudo update-rc.d autossh.sh defaults

完成自启动服务的添加

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment