此脚本功能主要是找到/data1到/data11下面在当前时间一天以外的所有文件,并复制到另外一台新机器上面。
注意:重点检验自动化交互输入密码,进行远程文件复制功能
#!/usr/bin/python #coding=utf-8 #字符编码 import os #os模块 import pexpect #自动交互模块 import time #导入时间模块 dir_name=os.popen("ls -l / |grep 'data[0-9]\{1,2\}'|awk '{print $NF}'").readlines() #统计/data后面带有数字的目录,例/data1-11 def cp_file(): #scp复制文件函数 global jindu #定义全局变量,jindu global wangsu #定义全局变量,wangsu global log_success #定义全局变量,log_sucess global log_fail #定义全局变量,log_fail global local_fail #定义全局变量,local_fail file_order='scp -oStrictHostKeyChecking=no %s %s@%s:%s' %(fullname,user,add_ip,dirname) #执行scp复制命令 # -oStrictHostKeyChecking=no",用来避免 输入第一次 执行ssh 要求收入yes/no 用的 scp_file=pexpect.spawn(file_order,timeout=100000) #执行pexpect的spawn方法 scp_file.expect('password:') #自动交互匹配password关键字 scp_file.sendline(password) #自动匹配成功后,进行密码发送 scp_file.read() #这个参数我在百度查询的,如果不加就复制不成功 jindu=scp_file.before.split()[-4] #判断复制文件是否成功,根据进度调进行判断,如果进度调为100%,表示成功. wangsu=scp_file.before.split()[-2] #获取同步速度 log_success='%s %s %s 文件同步成功!\n' %(now_time,fullname,wangsu) #成功日志显示 log_fail='%s %s 文件同步失败!\n' %(now_time,fullname) #失败日志显示 local_fail='%s %s 本地文件不存在!\n' %(now_time,fullname) #检查本地文件是否存在 scp_file.close() #进行关闭 for dir_line in dir_name: #对dir_name进行匹配 mulu=dir_line.strip() #去掉两边空格,进行赋值 find_file="find /%s -type f -mtime +1|xargs ls -l" %mulu #判断当前时间1天以外的所有数据 return_file=os.popen(find_file).readlines() #执行shell程序,并把结果赋值到retrun_file变量 mulu_list=[] #存放目录的列表 for file_line in return_file: #对第一个目录进行循环 fullname=file_line.strip().split()[8] #取出文件全路径名 dirname=os.path.dirname(file_line.strip()).split()[8] #取出目录名字 scp_file_success=file('/tmp/scp_file_success.log','a') #同步复制成功写入日志 scp_file_fail=file('/tmp/scp_file_fail.log','a') #同步复制失败写入日志 now_time=time.strftime('%Y%m%d %H:%M:%S',time.localtime(time.time()))#复制文件当前时间 add_ip="192.168.3.1" #新cache节点ip user="root" #新cache节点用户 password="123" #新cache节点密码 if os.path.isfile(fullname)==True: #判断旧节点拷贝文件是否存在,如果存在就继续执行,如果不存在写日志记录,继续循环 if dirname not in mulu_list: #判断目录是否存在mulu_list列表,如果不存在,则到新节点先创建目录,再复制文件 mkdir_order='mkdir -p %s' %dirname #新建目录用到的权限 ssh_server="ssh -oStrictHostKeyChecking=no %s '%s'" %(add_ip,mkdir_order) #执行ssh登陆脚本 create_directory=pexpect.spawn(ssh_server) #执行pexpect的spawn方法,ssh登陆 create_directory.expect('password:') #自动交互匹配password关键字 create_directory.sendline(password) #自动匹配成功后,进行密码发送 create_directory.read() #这个参数我在百度查询的,如果不加就复制不成功 create_directory.close() #进行关闭 mulu_list.append(dirname) #创建成功的目录添加到列表 cp_file() #执行文件复制方法 if jindu=="100%": #判断复制文件是否成功,根据进度调进行判断,如果进度调为100%,表示成功. scp_file_success.write(log_success) else: scp_file_fail.write(log_fail) else: #v如果新节点目录存在则直接拷贝文件 cp_file() #执行文件复制方法 if jindu=="100%": #判断复制文件是否成功,根据进度调进行判断,如果进度调为100%,表示成功. scp_file_success.write(log_success) else: scp_file_fail.write(log_fail) else: scp_file_fail.write(local_fail) del mulu_list[:] #每次循环一个data目录就清空列表 scp_file_success.close() #日志关闭 scp_file_fail.close() #日志关闭