近日有一个需求,公司有部分windwos机器,而客户需要查看应用生成的日记,一台台查找比较繁琐,所有就需要写一个脚本,每隔十分钟自动压缩日记目录并上传至部署在linux的ftp服务器上。
首先需要再linux上搭建ftp服务器,我们用vsftp服务;
我用的是定制化的vsftp文件,下载地址:vsftp下载
需要先把机器原有的vsftp卸载了:
[root@zabbix ~]# rpm -qa|grep vsftpd^C
[root@zabbix ~]# yum erase vsftpd
然后下载这个vsftp软件:
把vsftpd的配置文件和启动脚本都修改内容:
[root@zabbix vsftpd]# mv vsftpd.conf /etc/vsftpd/vsftpd.conf
[root@zabbix vsftpd]# mv vsftp /etc/init.d/vsftpd
需要设置的ftp的模式及用户名密码 ip等信息都在这个文件夹下面: 这里使用的 pasv 被动模式
ftp连接时会出现问题,大多问题都出现在ftp的模式上,需要重点了解下两种模式区别及使用场景。如下:
pasv 被动模式,客户端向服务器的端口(默认是21)发送连接请求,服务器接收连接,建立一条命令链路,当需要传送数据时,服务端会在命令链路上用pasv命令告诉客户端,我打开了XXX端口,你过来连我,于是客户端向服务端XXX端口发起连接请求,建立一条数据链路传送数据。
port 主动模式,客户端向服务器的端口(默认是21)发送连接请求,服务器接收连接,建立一条命令链路,当需要传送数据时,客户端在命令链路上用post命令告诉服务器端,我打开了XXX端口,你过来连我,于是服务端从20端口向客户端XXX端口发起连接请求,建立一条数据链路传送数据。
由此看来,两种模式的命令链路建立是一样的,而数据链路的建立则不一样。
请注意:选择用PASV方式还是PORT方式登录FTP服务器,选择权在FTP客户端。
客户端有两个要求,要求如下:
1、客户端只有公网ip,没有内网ip, 从上面的介绍可知,如果用POST方式,由于客户端没有公网IP,FTP无法连接客户端建立数据链路,这种请求下客户端必须要是用pasv模式,才能连接FTP服务器,大多数人连接不上都是此原因.就是因为客户端没有公网ip导致的。
2、客户端有公网IP,但是安装了防火墙。如果用pasv方式登录FTP服务器,因为建立数据链路的时候,是客户端向服务器端发送连接请求,没有问题,反过来,如果用POST方式登录FTP服务器,因为建立数据链路的时候,是由服务器端向客户端发送连接请求,此时连接请求会被防火墙拦截,如果要用POST方式连接FTP服务器,请打开1024以上的端口。
[root@zabbix vsftpd]# cat /etc/vsftpd/vsftpd.conf|grep -v '^#'
anonymous_enable=YES
local_enable=NO
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=NO
pasv_enable=YES
pasv_address=1.1.1.1
pasv_addr_resolve=YES
pasv_min_port=50001
pasv_max_port=55700
pasv_promiscuous=YES
xferlog_std_format=YES
注释:在上图/etc/vsftpd/vsftd.conf文件里,需要修改IP地址,自定义端口号 用户名 密码等信息。
修改完成后重启vsftpd服务。
然后在本地用FileZilla软件来测试是否能正常连接。
可以的话就可以写bat脚本:
脚本分为两部分:
压缩脚本:由于我用的7z压缩软件,方便在linux上解压查看。主要使用在windows上压缩的。
cd "D:\Program Files\ftplog"
d:
set "name=%date:~0,4%_%date:~5,2%_%date:~8,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%"
"C:\Program Files\7-Zip\7z.exe" a -tzip %name%.7z logs
注释:cd 需要进入到这个目录下,但是还是需要加 d: 才能进入到一个目录。用set设置一个时间的变量。
然后用7z的程序来压缩D:\Program Files\ftplog\logs这个目录:
ftp传输脚本:
del /q "D:\Program Files\ftplog\*.7z" > run.log
call 7z.bat >> run.log
echo open 172.17.9.3 1234 >ftp.txt
echo root>>ftp.txt
echo 123456>ftp.txt
echo cd /shiban01/172.17.8.17_logs >>ftp.txt
echo binary >>ftp.txt
echo lcd ”D:\Program Files\ftplog“ >>ftp.txt
echo prompt *.7z >>ftp.txt
echo mput *.7z >>ftp.txt
echo bye >>ftp.txt
FTP -s:ftp.txt
del ftp.txt
注释:首先需要删除windwos目录下上次残留的压缩文件,然后用call调用同级目录下7z.bat文件。
然后用ftp的命令的命令写入到ftp.txt,然后用调用这个文件,连接ftp,
binary 切换到本地目录,
lcd 路径 进入到本地某个目录
prompt 用来关闭交互,要不然每次都要输入y.
linux 上需要设置删除三天前的日记内容:
[root@zabbix profile.d]# cat /etc/profile.d/ftp.sh
#!/bin/bash
find /var/ftp/sh/ -type f +mtime +3 -name "*.7z" -exec rm -rf {} \;
[root@zabbix profile.d]# crontab -l
0 1 * * * sh /etc/profile.d/ftp.sh
附记:碰到问题:
由于windwos只支持POST方式,如果客户端是内网ip,服务端在公网,则访问还有问题。
最好是服务器和客户端都在公网,或者服务端和客户端都在内网,这样才不会有问题。
来源:oschina
链接:https://my.oschina.net/yuanhaohao/blog/4367411