在按公司的安全需要搭建完一个简易的堡垒机后(见 linux下自建ssh堡垒机),又遇到了一个迫切需求的一件事---传文件。由于所有所端主机的hosts.allow只允许堡垒机连接,而其他所有服务默认都是deny的。所以无论是服务器上上传文件或是下载文件,都需要通过sftp命令传到堡垒机,再由堡垒机上传或下载。这种来回传的事情让运维人员都感觉是种麻烦,更不要说开发人员了。于是临时文件服务器的需求就产生了。
解决思路:
临时搭建一个rsync 或 ftp服务器,在所有的服务器上都可以将临时文件上传到该服务器上,最终给出一个url,通过该URL,就可以wget 下来刚刚上传的文件。
实施方案:
最终选择了rsync+http的组合。rsync和http的搭建这里略过,因为比较简单也不是重点,重点是传文件的脚本,脚本内容如下
#!/bin/bash if [[ "$1" != "" ]]; then filename=$(cat /proc/sys/kernel/random/uuid).$(basename $1) echo -ne " 33[5mUploading file... Please waiting! 33[0m" rsync -azq $1 rsynctmp@file.361way.com::ftptmp/${filename} if [[ "$?" == "0" ]];then echo -e "r 33[KUpload Sucesses!" echo "URL: http://file.361way.com:8888/ftptmp/${filename}"; echo -e " 33[31;5mNotice: This file will only keep for 24 hours!!!! 33[0m" else echo "Upload Faild! Please try again!" fi else echo "Please input filename!!" exit 1 fi
注:
1、rsync这里没有使用密码,如果有更安全的需要,可以设置下密码。并在rsync的配置中指定密码文件。
2、出于安全考虑,也可以使用shc工具对该脚本进行加密 。
用法:
将该脚本保存为gettmpurl ,并赋予可执行权限,放到每台服务器的/usr/bin目录下。以后在各机器上有上传文件的需求时,只需要执行gettmpurl filename就OK了。
# gettmpurl deploy.sh Upload Sucesses! URL: http://file.361way.com:8888/ftptmp/38999541-35ab-4d59-8e8e-700291dd966e.deploy.sh Notice: This file will only keep for 24 hours!!!!
是不是发现传文件原来也可以是件如此幸福的事情!
为了避免文件服务器爆满,可以每天自动清理一天之前的文件,如下:
# find rsync目录 -mtime +5 -name "*.*" -exec rm -f {} ;
将以上部分配置到crontab里,每天定期执行就行了。