python使用pexpect实现与ftp的自动交互
转载请注明出处:http://www.cnblogs.com/blazer/p/5318516.html
环境:centos6.5 python2.6.6
依赖包:pexpect-4.0.1, ptyprocess-0.5.1
由于sftp需要手动输入密码,然后再get文件,如此繁琐的任务还是交给机器去做吧!
import pexpect, sys, os, datetime, subprocess test=False print ' ' print '===== begin : ' + datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # command info home = '/home/www/' port = '22222' host = 'data@x.x.x.x' timeout = 1 * 60 * 10 # seconds # file name now_yyyyMMddHH = datetime.datetime.now().strftime('%y%m%d%H') file_name = 'data' + now_yyyyMMddHH + '0001.zip' md5_name = file_name + '.md5' md5_local = file_name + '.md5.local' # download path download_path = '/home/www/tmp_jinfu/' target_path = '/home/www/temp_jinfu/' if not os.path.isdir(download_path) : os.makedirs(download_path) if not os.path.isdir(target_path) : os.makedirs(target_path) # check md5 file if exists if not test and os.path.exists(download_path + md5_name) : print 'file ' + download_path + md5_name + ' is exists...' print 'download is exit !!!' print '===== end : ' + datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') exit(0) print 'download ' + download_path + md5_name + ' start ...' child = pexpect.spawn(command = '/usr/bin/sftp -oPort=%s -oIdentityFile=key_sftp %s' % (port, host), cwd = home) child.expect("Enter passphrase for key", timeout = timeout) child.sendline('hengda2016') child.sendline('get full/%s %s' % (md5_name, download_path)) i = child.expect(['100%', 'not found'], timeout = timeout) child.sendline('exit') # check download , and md5 file if exists if i == 1 or not os.path.exists(download_path + md5_name) : print 'download full/' + md5_name + ' is fail !!! file not found.' print '===== end : ' + datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') exit(-1) print 'download ' + download_path + md5_name + ' over ...' print 'download ' + download_path + file_name + ' start ...' child = pexpect.spawn(command = '/usr/bin/sftp -oPort=%s -oIdentityFile=key_sftp %s' % (port, host), cwd = home) child.expect("Enter passphrase for key", timeout = timeout) child.sendline('hengda2016') child.sendline('get full/%s %s' % (file_name, download_path)) i = child.expect(['100%', 'not found'], timeout = timeout) child.sendline('exit') if i == 1 : print 'download full/' + file_name + ' is fail !!! file not found.' print '===== end : ' + datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') exit(-1) print 'download ' + download_path + file_name + ' over ...' # check md5sum spawn s = subprocess.call('md5sum %s | cut -d \' \' -f1 > %s' % (file_name, md5_local), shell = True, cwd = download_path) if s != 0 : print 'md5sum is fail !!!' md5_name_text = open(download_path + md5_name).read() md5_local_text = open(download_path + md5_local).read() # equals ftp md5 and local md5 by zip file if md5_name_text == md5_local_text : print 'md5 == md5.local ... download ' + file_name + ' is sucess !!!' s = subprocess.call('mv %s %s' % (download_path + file_name, target_path), shell = True, cwd = download_path) if s == 0 : print 'mv %s %s' % (download_path + file_name, target_path) + ' is success !!!' else : print 'mv %s %s' % (download_path + file_name, target_path) + ' is fail !!!' else : print 'md5 != md5.local ... download ' + file_name + ' is fail !!! please you check the file !!! !!! !!!' print '===== end : ' + datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
说明:
-oIdentityFile=key_sftp这个是密钥key文件