Python 连接Linux服务器完成上传下载和执行命令及查询目录下的文件

2023-05-16

Python 连接Linux服务器完成上传下载和执行命令及查询目录下的文件

记录一些用于连接linux获取远端文件或者上传文件的小工具,另外还有执行shell命令和查找linux目录下文件是否存在

# -*- coding: utf-8 -*-
"""
@Time    : 2021/7/22 10:31
@Author  : chenhj
@File    : sshclient.py
@Software: PyCharm 
@Comment : 
"""
import osfrom stat 
import S_ISDIR
import re
import paramikofrom paramiko.ssh_exception 
import NoValidConnectionsError, AuthenticationException, SSHException

class SshRemoteConnection:
	def __init__(self, hostname, port, user, password):
		self.hostname = hostname
		self.port = port
		self.user = user
		self.password = password
	def do_connect(self, conn):    
		"""创建连接"""    
		if conn == "SSHClient":        
			client = paramiko.SSHClient()        
			client.set_missing_host_key_policy(paramiko.AutoAddPolicy())        
			try:            
				client.connect(hostname=self.hostname,port=self.port,username=self.user,password=self.password)
				print("正在连接 {}".format(self.hostname).center(100, '*'))       
			except NoValidConnectionsError as e:            
				print(f"连接失败:{e}".center(100, '*'))        
			except AuthenticationException as e:            
				print(f"密码错误:{e}".center(100, '*'))        
			return client    
		elif conn == "Transport":        
			# 获取Transport实例        
			tran = paramiko.Transport(self.hostname, int(self.port))        
			try:            
			# 连接SSH服务端            
				tran.connect(username=self.user, password=self.password)        
			except SSHException as e:            
				print(f'连接失败:{e}'.center(100, '*'))        
			return tran
	def do_cmd(self, cmd):    
		"""执行shell命令,多条命令以分号‘;’隔开"""    
		# 连接    
		conn = self.do_connect('SSHClient')    
		# 执行操作    
		stdin, stdout, stderr = conn.exec_command(cmd, get_pty=True)    
		# 获取命令执行的结果    
		res, err = stdout.read().decode('utf-8'), stderr.read().decode('utf-8')    
		result = res if res else err    
		print('执行成功'.center(100, '*'))    
		print(result)    
		return result
	def do_put_file(self, local_path, remote_path):    
		"""上传单个文件"""
		print('正在上传文件...'.center(100, '*'))
		conn = self.do_connect('Transport')
		sftp = paramiko.SFTPClient.from_transport(conn)
		try:
			sftp.put(local_path, remotepath=remote_path) 
			print(f'{local_path}文件上传到{self.hostname}主机的{remote_path}')
		except SSHException as e:        
			print(f'上传失败:{e}'.center(100, '*'))    
			conn.close()
	def __get_all_local_files(self, local_dir):    
		"""获取需要批量上传目录下的所有文件"""    
		all_files = list()    
		files = os.listdir(local_dir)    
		for i in files:       
			local_filename = os.path.join(local_dir, i)        
			if os.path.isdir(i):            
				all_files.extend(self.__get_all_local_files(local_filename))        
			else:            
				all_files.append(local_filename)    
			return all_files
	def do_put_all_files(self, local_path, remote_path):    
		"""批量上传所有文件"""    
		print('正在上传文件...'.center(100, '*'))    
		conn = self.do_connect('Transport')    
		sftp = paramiko.SFTPClient.from_transport(conn)    
		# 去掉路径字符串最后的字符'/',如果有的话    
		if remote_path[-1] == '/':        
		remote_path = remote_path[0:-1]    
		# 获取本地目录下的所有文件    
		all_files = self.__get_all_local_files(local_path)    
		try:        
			for file in all_files:            
				local_filename = os.path.split(file)[-1]            
				remote_filename = remote_path + '/' + local_filename            
				print('{} 文件正在传输中...'.center(100, '*').format(remote_filename))            
				sftp.put(file, remote_filename)            
				print('文件传输成功...'.center(100, '*').format(remote_filename))    
		except SSHException as e:        
			print(f'上传失败:{e}'.center(100, '*'))    
		conn.close()
	def do_get_file(self, remote_path, local_path):    
		"""下载文件"""    
		print('正在下载文件...'.center(100, '*'))    
		conn = self.do_connect('Transport')    
		sftp = paramiko.SFTPClient.from_transport(conn)    
		try:        
			sftp.get(remotepath=remote_path, localpath=local_path)        
			print(f'{remote_path}文件从{self.hostname}主机下载到{local_path}成功')    
		except SSHException as e:        
			print(f'下载失败:{e}'.center(100, '*'))    
		conn.close()
	def __get_all_remote_files(self, sftp, remote_dir):    
		"""获取需要批量下载目录下的所有文件"""    
		all_files = list()    
		# 去掉路径字符串最后的字符'/',如果有的话    
		if remote_dir[-1] == '/':        
		remote_path = remote_dir[0:-1]    
		files = sftp.listdir_attr(remote_dir)    
		for i in files:
			remote_filename = remote_dir + '/' + i.filename        
			# 判断是不是路径,是路径的话,遍历路径下的文件        
			if S_ISDIR(i.st_mode): 
			all_files.extend(self.__get_all_remote_files(sftp, remote_filename))        
			else:            
				all_files.append(remote_filename)    
				return all_files
	def do_get_all_files(self, remote_path, local_path):   
		"""批量下载目录下所有文件"""    
		print('正在批量下载文件...'.center(100, '*'))    
		conn = self.do_connect('Transport')    
		sftp = paramiko.SFTPClient.from_transport(conn)    
		all_files = self.__get_all_remote_files(sftp, remote_path)    
		# 依次下载每一个文件    
		for file in all_files:        
			filename = file.split('/')[-1]        
			local_filename = os.path.join(local_path, filename)        
			print(f'{filename} 文件正在传输中...'.center(100, '*'))        
			sftp.get(file, local_filename)    
		print('传输完成...'.center(100, '*'))    
		conn.close()
	def do_search_file(self, check_dir, checkup=None, fuzzy=True):    
		"""校验目录下的文件,默认模糊查询fuzzy=True,匹配忽略大小写"""    
		res = self.do_cmd(f'cd {check_dir};ls')    
		dir_list = [i for i in res.split('\r\n') if i != '']    
		num = 0    
		all_file = []    
		print('正在获取检索结果...'.center(100, '*'))    
		for file in dir_list:        
			if fuzzy:            
				ma = re.compile(f'{checkup}', flags=re.IGNORECASE).findall(f'{file}')        
			else:            
				ma = re.compile(f'{checkup}').findall(f'{file}')        
			if ma:            
				print(file)            
				all_file.append(file)            
				num += 1       
			else:            
				print('...')    
		print(f'检索完毕...找到{num}个结果'.center(100, '*'))    
		return all_file
	def do_review_contents(self):    
		pass


	if __name__ == "__main__":    
		s = SshRemoteConnection('99.99.45.123', 22, 'user', "123!@#")    
		s.do_cmd('pwd;ls -l')    
		localpath = 'D:\\00_data\\test'    
		filename = '111.DAT'    
		remotepath = '/data/20210719'    
		remote_filename = filename    
		# s.do_put_all_files(f'{localpath}', f'{remotepath}')    
		# s.do_put_file(f'{localpath}\\{filename}', f'{remotepath}\\{remote_filename}')    
		s.do_get_all_files(remotepath, localpath)    
		s.do_search_file('/data/20210719', 'txt')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 连接Linux服务器完成上传下载和执行命令及查询目录下的文件 的相关文章

随机推荐

  • 搞懂Java高级特性--注解

    1 注解是什么 xff1f Java注解 xff08 Annotation xff09 又称Java标注 xff0c 是JDK5 0引入的一种注释机制 xff0c 注解是元数据的一种形式 xff0c 提供有关于程序但不属于程序本身的数据 x
  • 为什么都说代码改变世界?是因为这五位程序员创造了未来!

    致敬那些为软件开发奠定坚实基础的计算机科学先驱 从 1 和 0 开始 xff0c 编程经历了很长一段路 xff0c 才达到了现在的抽象状态 过去的程序员用伟大的发明 xff0c 为现代程序员轻松地完成工作奠定了坚实的基础 如果我们研究某个软
  • 编译提示缺少libjli.so,jar command not found,javadoc错误等

    这周一周忙于Ubuntu server环境下的Android编译环境的搭建 xff0c 由于刚开始真正使用Linux xff0c xff08 以前虽然用过Ubuntu xff0c 但是就当win用了 就这样还没坚持下来 xff0c 现在工作
  • 银河麒麟系统4.0.2离线安装MySQL教程

    银河麒麟系统4 0 2离线安装MySQL教程 xff08 Ubuntu离线安装MySQL教程 xff09 https www jianshu com p 478dc7c9b9e0 这个教程很详细 xff0c 我不再多说 xff0c 而且亲测
  • 实现线程同步的几种方式

    在多线程中线程的执行顺序是依靠哪个线程先获得到CUP的执行权谁就先执行 xff0c 虽然说可以通过线程的优先权进行设置 xff0c 但是他只是获取CUP执行权的概率高点 xff0c 但是也不一定必须先执行 在这种情况下如何保证线程按照一定的
  • STC开天斧虚拟示波器使用

    开天斧外观图 xff0c 颜值非常可以 1 在keil中添加STC8H8K64U的型号和头文件 xff0c 添加功能在STC IPS软件里 首先点击Keil仿真设置 xff0c 然后选择单片机型号STC8H8K64U xff0c 然后点击添
  • android AlertDialog 弹窗自定义布局 点击外部不关闭弹窗

    AlertDialog span class token punctuation span Builder builder span class token operator 61 span span class token keyword
  • delete释放new[] 以及 delete[]释放new 的问题

    在同花顺 的笔试过程中遇到这么一个类似问题 A ptr 61 new A 10 for int i 61 0 i lt n i 43 43 delete amp ptr i 由此衍生出两个问题 new 申请的空间用delete释放会发生什么
  • C#中的readonly与const区别

    xfeff xfeff const 的概念就是一个包含不能修改的值的变量 常数表达式是在编译时可被完全计算的表达式 因此不能从一个变量中提取的值来初始化常量 如果 const int a 61 b 43 1 b是一个变量 xff0c 显然不
  • 改变无线连接、有线连接的优先级

    有线和无线连的是同一个网络 xff0c 当笔记本打开时 xff0c 总是优先使用无线连接 xff0c 如何转变优先级为有线连接呢 xff1f 1 打开网络和共享中心 2 更改适配器设置 xff0c 打开网络连接窗口 3 单击此窗口的高级菜单
  • 杂感一

    从2014年7月工作至今已有快2年了 xff0c csdn的博客从毕业后就很少上了 工作中有很多收获 技术上 也在不断积累和成长中 不管做什么事情 xff0c 要坚持下去 xff0c 方得初心 xff0c 把坚持养成习惯 xff0c 学习如
  • Kotlin实战---Retrofit网络模型

    没有Kotlin基础的小伙伴先进这里 Koltin基础文章 1 Java和Kotlin互相调用之间的注意事项 1 解决关键字冲突 span class token keyword public span span class token k
  • MFC隐藏主窗口的方法

    隐藏基于对话框的MFC应用程序窗口的方法 推荐这个方法 xff0c 非常好用 很多人可能会将窗口创建出来 然后用一个 ShowWindow SW HIDE 的方法去隐藏窗口 当然这是可以做到隐藏的功能 但是有一点不足的地方就是窗口在隐藏之前
  • JSP 通过Servlet将excel数据导入SQL

    1 gt 在网上下载jxl jar 这个JAR包用于Java操作excel 下载后 xff0c 将这个包复制到工程Webroot下的WEB INF下的lib中 xff0c 或是在工程中导入jxl jar包 2 gt 准备excel文件 如图
  • 1=5,2=15,3=215,4=2145,那么5=?

    如题 xff0c 1 61 5 xff0c 2 61 15 xff0c 3 61 215 xff0c 4 61 2145 xff0c 那么5 61 xff1f 答案 xff1a 5 61 1 哎 xff0c 这个题出的 xff0c 没反应过
  • 村子里有50个人,每人有一条狗,在这50条狗中有病狗(这种病不传染),于是人们要找出病狗。

    xff29 xff22 xff2d 公司向来以高素质人才作为企业持续竞争力的保证 进入 xff29 xff22 xff2d 公司是差不多每个 xff29 xff34 人的梦想 下面这条 xff29 xff22 xff2d 公司的面试题 xf
  • 删除单向链表中的某一个节点

    已知一个单向链表的表头head xff0c 写出一个删除某一个节点的算法 xff0c 要求先找到此节点 xff0c 然后删除 include lt iostream gt using namespace std typedef struct
  • 多段图的最短路径问题-----动态规划法

    对多段图 xff0c 求最短路径 xff0c 如图 xff1a 对其使用动态规划法 xff1a 阶段 xff1a 将图中的顶点划分5个阶段 xff0c k 状态 xff1a 每个阶段有几种供选择的点s 决策 xff1a 当前状态应在前一个状
  • Android 文件存储 和 权限管理

    转载请标明出处 xff1a xff1a http blog csdn net huaiyiheyuan article details 52473984 android SD卡主要有两种存储方式 Internal External Stor
  • Python 连接Linux服务器完成上传下载和执行命令及查询目录下的文件

    Python 连接Linux服务器完成上传下载和执行命令及查询目录下的文件 记录一些用于连接linux获取远端文件或者上传文件的小工具 xff0c 另外还有执行shell命令和查找linux目录下文件是否存在 span class toke