基于Python实现的ssh兼sftp客户端
otherTools.py
#!/usr/bin/env/ python
# -*- coding:utf-8 -*-
__author__ ='laifuyu'
importos
importsubprocess
classOtherTools:
def__init__(self):
self.filepath_list = []
# 批量创建目录
defmkdirs_once_many(self, path):
path = os.path.normpath(path) # 去掉路径最右侧的\\、/
path = path.replace('\\','/')# 将所有的\\转为/,避免出现转义字符串
head, tail = os.path.split(path)
new_dir_path ='' # 反转后的目录路径
root ='' #根目录
if notos.path.isdir(path)andos.path.isfile(path): # 如果path指向的是文件,则继续分解文件所在目录
head, tail = os.path.split(head)
iftail =='':
return
whiletail:
new_dir_path = new_dir_path + tail +'/'
head, tail = os.path.split(head)
root = head
else:
new_dir_path = root + new_dir_path
# 批量创建目录
new_dir_path = os.path.normpath(new_dir_path)
head, tail = os.path.split(new_dir_path)
temp =''
whiletail:
temp = temp +'/'+ tail
dir_path = root + temp
if notos.path.isdir(dir_path):
os.mkdir(dir_path)
head, tail = os.path.split(head)
# 测试
ssh_client = MySSHClient()
ssh_client.connect(hostname='192.168.1.102',port=22,username='root',password='huozhe')
ssh_client.exec_command('ls -l')
ssh_client.download_file('/root/dirForDownload/file','./test1.txt')
ssh_client.download_file('/root/dirForDownload/file','.\test2.txt')
ssh_client.download_file('/root/dirForDownload/file','d:\\test3.txt')
ssh_client.download_file('/root/dirForDownload/file','d:\test4.txt')
ssh_client.download_file('/root/dirForDownload/file','d:\mytest4.txt')
ssh_client.download_file('/root/dirForDownload/file','d:/test5.txt')
ssh_client.download_file('/root/dirForDownload/file','d:\dir1\dir2\test6.txt')
ssh_client.upload_file('./test1.txt','/root/test1.txt')
ssh_client.upload_file('d:\mytest4.txt','/root/mytestfile.txt')
ssh_client.upload_file('d:\dir1\dir2\test6.txt','./test6.txt')
ssh_client.close()
运行结果:
# 1. 下载文件
# 1) 不支持目录级的下载,即只能下载指定的单个非目录文件
# 2) 本地目标文件路径只支持文件路径,不支持目录(比如localpath='d:\\'),目标文件所在的上级路径可以不存在(但路径必须位于分区下)
# 比如欲下载到本地路径:d:\dir1\dir2\test.txt, d:\dir1\dir2\可以不存在
# 3) 本地目标文件支持相对路径,比如./text.txt,远程目标文件仅支持绝对路径
# 2. 上传文件
# 1) 不支持目录级的上传,只能上传指定的单个文件
# 2) 远程目标文件所在的上级路径必须存在,比如remotepath='/root/dir1/tarfile',其中/root/dir1必须存在
# 3) 远程目标文件、本地文件路径都支持相对路径,比如./text.txt
# 3. 重复下载文件、上传文件,会自动覆盖已经下载的文件、已上传的文件
参考文档:
http://docs.paramiko.org/en/2.4/api/channel.html
http://docs.paramiko.org/en/2.4/api/sftp.html#paramiko.sftp_client.SFTPClient