scp port forwarding的完整解决方案

来源:互联网 发布:立体匹配算法不是全局 编辑:程序博客网 时间:2024/05/21 20:30

场景:

目标: 利用scp将远程主机SERVER2上的某文件FILE拉至本地主机SERVER1上, 脚本为

#!/bin/bash

scp user2@SERVER2:/PATH_OF_FILE  .


限制: 由于安全因素,SERVER2和SERVER1之间不能建立连接。另外有一远程主机SERVER3,即可以连接SERVER1,也能连接SERVER2


解决方案: 考虑使用 ssh port forwarding建立隧道,脚本为

#!/bin/bash

ssh -f -N -L 1234:SERVER2:22  user3@SERVER3

scp -P 1234 user2@localhost:/PATH_OF_FILE  .

第二行语句建立一条在背景运行的ssh隧道。-f 表示在后台运行,-N 表示只建立隧道,本句并包括在远程主机执行的命令。剩下的 -L 1234:SERVER2:22 user3@SERVER3 指明隧道的具体参数,意为以SERVER2上的user3作为跳板的一条隧道,隧道的本地端口号为1234,隧道的目的端口号为22。即任何对本地1234号端口进行的tcp连接都相当于是对SERVER2的22号端口的连接。由于scp就是使用22号端口,所以第三行语句就好理解了。

第三行语句指明从本地的第1234号端口使用scp将FILE拉至当前目录。由于第二句已建立隧道,所以实则以SERVER3为代理,将文件拉至本地目录。但由于隧道一直在后台运行,当传输完毕,我们需要将其关闭,这该如何实现呢?


新问题: 如何关闭运行于后台的ssh隧道?

关闭后台运行的隧道的唯一方式是关闭其进程。所以问题分解为

1. 获取进程ID,即PID 。 方法1: PID=$!    方法2: ps aux | grep [1234:S]ERVER2:22 | awk  '{ print $2 }'

2. 杀掉进程, 命令:  kill -9  $PID


使用方案1,脚本为

#!/bin/bash

ssh -f -N -L 1234:SERVER2:22  user3@SERVER3 & PID=$! 

scp -P 1234 user2@localhost:/PATH_OF_FILE  .

kill -9 $PID


使用方案2, 脚本为

#!/bin/bash

ssh -f -N -L 1234:SERVER2:22  user3@SERVER3

scp -P 1234 user2@localhost:/PATH_OF_FILE  .

PID=$(ps aux | grep [1234:S]ERVER2:22 | awk  '{ print $2 }')

kill -9 $PID

方案2已经过测试。方案1未完整测试,有可能得到的PID是该脚本进程而非后台进程的ID,欢迎测试讨论



原创粉丝点击