您的位置:首页 > 运维架构 > Linux

利用python实现ftp和远程操作linux

2018-03-08 14:37 597 查看
    Hello,大家好,我是隔壁小王,最近在工作中初次接触了使用python进行远程的操作的模块,觉得蛮实用的,这里也跟大家分享下,当然大神就绕道吧


    这个库叫paramiko,这个库就是实现了一些远程协议的库,简单好用,功能能强大哦。
    先介绍一下sftp的实现流程,假设我们的要下载一个目录下的所有文件,大体的实现流程是:链接目标主机;创建sftp对象;得到远程目录里的所有目标文件名;利用文件名与本地保存的文件夹组成目标文件路径;下载;关闭链接。
    具体的代码如下:def loadFile():
tar_list = []
local_list = []

# connect server & get file
transport = paramiko.Transport(('%s' % DataHost, DataPort))
transport.connect(username=DataUser, password=DatapPassword)
sftp = paramiko.SFTPClient.from_transport(transport)
file_names = sftp.listdir(server_compress_file_path)
for file in file_names:
tar_list.append(server_file_path + file)
local_list.append(local_file_path + file)

for i in range(len(tar_list)):
sftp.get(tar_list[i], local_list[i])
transport.close()    这是一个样例的函数,如果你想尝试,其中源目录、目的目录的路径(server_file_path, local_file_path)都是要自己另外设置内容的的。

    当然这就完善了吗?下载文件之前最好检查一下目标文件是否已经上传完成,那该怎么校验呢?用mtime,也就是文件的最后修改时间,姑且认为文件的最后修改时间如果超过当前时间2分钟这个文件就是上传完整的。怎么实现呢:
def checkTime(filePath):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(DataHost, DataPort, DataUser, DatapPassword)

stdin, stdout, stderr = ssh.exec_command('stat ' + filePath)
time_info = stdout.read()
ssh.close()

mtime = re.search('(最近改动:)(.{19})', time_info).group()[-19:]
mtimestamp = time.mktime(time.strptime(mtime, "%Y-%m-%d %H:%M:%S"))
curtime = time.time()

if (curtime - mtimestamp) > 120:
return True
else:
return False    这里正好也提出的ssh的使用方法,大家可以看到,ssh的调用要更加简单,其中set_missing_host_key_policy()是用来绕过首次登陆时的验证的。使用exec_command可以得到一个反馈元组,这个元组中的参数2可以打印出远程文件的一些列信息,参数1是输入信息,参数3是反馈的错误信息。通过正则表达式找到最后修改时间,利用time模块转成时间戳与本地的时间戳进行比较,得到结果。这里提一嘴,我的正则很少用,写的比较生硬,所以匹配的时候没有排除“最近改动:”这几个字符,从而不得不选择切片最后的19个有用的时间字符,会正则可以帮我指导下,谢谢。
    那么这两段函数结合下:def loadFile():
tar_list = []
local_list = []

# connect server & get file
transport = paramiko.Transport(('%s' % DataHost, DataPort))
transport.connect(username=DataUser, password=DatapPassword)
sftp = paramiko.SFTPClient.from_transport(transport)
file_names = sftp.listdir(server_compress_file_path)
for file in file_names:
tar_list.append(server_file_path + file)
local_list.append(local_file_path + file)

for i in range(len(tar_list)):
if checkTime(tar_list[i]):
sftp.get(tar_list[i], local_list[i])
else:
printInfo("file:%s is not upload perfectly!" % tar_list[i])
continue
transport.close()    这就是一个带sftp、ssh以及时间校验的远程文件下载样例了。
    谢谢您的阅读,如果有什么建议或指导欢迎您的留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 文件下载