在按公司的安全需要搭建完一个简易的堡垒机后(见 linux下自建ssh堡垒机),又遇到了一个迫切需求的一件事---传文件。由于所有所端主机的hosts.allow只允许堡垒机连接,而其他所有服务默认都是deny的。所以无论是服务器上上传文件或是下载文件,都需要通过sftp命令传到堡垒机,再由堡垒机上传或下载。这种来回传的事情让运维人员都感觉是种麻烦,更不要说开发人员了。于是临时文件服务器的需求就产生了。

解决思路

临时搭建一个rsync 或 ftp服务器,在所有的服务器上都可以将临时文件上传到该服务器上,最终给出一个url,通过该URL,就可以wget 下来刚刚上传的文件。

实施方案

最终选择了rsync+http的组合。rsync和http的搭建这里略过,因为比较简单也不是重点,重点是传文件的脚本,脚本内容如下

 1#!/bin/bash
 2if [[ "$1" != "" ]]; then
 3    filename=$(cat /proc/sys/kernel/random/uuid).$(basename $1)
 4    echo -ne " 33[5mUploading file... Please waiting! 33[0m"
 5    rsync -azq $1 rsynctmp@file.361way.com::ftptmp/${filename}
 6    if [[ "$?" == "0" ]];then
 7        echo -e "r 33[KUpload Sucesses!"
 8        echo "URL: http://file.361way.com:8888/ftptmp/${filename}";
 9        echo -e " 33[31;5mNotice: This file will only keep for 24 hours!!!! 33[0m"
10    else
11        echo "Upload Faild! Please try again!"
12    fi
13else
14    echo "Please input filename!!"
15    exit 1
16fi

注:

  1. rsync这里没有使用密码,如果有更安全的需要,可以设置下密码。并在rsync的配置中指定密码文件。
  2. 出于安全考虑,也可以使用shc工具对该脚本进行加密 。

用法

将该脚本保存为gettmpurl ,并赋予可执行权限,放到每台服务器的/usr/bin目录下。以后在各机器上有上传文件的需求时,只需要执行gettmpurl filename就OK了。

1# gettmpurl deploy.sh
2Upload Sucesses!
3URL: http://file.361way.com:8888/ftptmp/38999541-35ab-4d59-8e8e-700291dd966e.deploy.sh
4Notice: This file will only keep for 24 hours!!!!

是不是发现传文件原来也可以是件如此幸福的事情!

为了避免文件服务器爆满,可以每天自动清理一天之前的文件,如下:

1# find  rsync目录  -mtime +5 -name "*.*" -exec rm -f {} ;

将以上部分配置到crontab里,每天定期执行就行了。