自动化交互输入密码,进行远程文件复制

此脚本功能主要是找到/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()    #日志关闭

你可能感兴趣的:(自动化交互输入密码,进行远程文件复制)