利用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以及时间校验的远程文件下载样例了。
谢谢您的阅读,如果有什么建议或指导欢迎您的留言。
。
这个库叫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 更新ssh 远程代码 操作远程服务器的实现代码
- python用parammiko模块实现linux的远程操作
- python用parammiko模块实现linux的远程操作
- python用parammiko模块实现linux的远程操作
- 利用JSCH实现远程操作Linux系统和hadoop集群
- Python 使用paramiko实现远程登录Linux主机并执行命令和操作
- 利用Python实现对linux服务器SSH远程连接和系统操作的几种方式
- Python之虚拟机操作:利用VIX二次开发,实现自己的pyvix(系列一)成果展示和python实例
- python fabric实现远程操作和部署
- 利用Python 1分钟搭建测试Web服务器,可实现linux目录文件共享
- 利用PyCharm实现Python远程调试
- python操作摄像头截图实现远程监控的例子
- 利用Indy的TIdFtp控件实现FTP协议, 远程下载上传文件
- python fabric实现远程操作和部署示例
- Linux平台下利用JNI+双向RMI实现远程推送
- python fabric实现远程操作和部署
- 利用java实现可远程执行linux命令的小工具
- 【python】利用sftp及rsa密匙实现远程拷贝文件
- 探究ftp的奥妙之系统用户如何上传下载文件、vsftpd如何识别证书并利用客户端来实现远程连接传输
- Python fabric实现远程操作和部署