python运维自动化Paramiko

文章目录

  • 一、Paramiko
    • 1、安装
    • 2、常用的类
    • 3、使用
      • (1)SSH执行远程命令
      • (2)SFTP上传/下载文件
      • (3)SSH简单封装
      • (4)SFTP简单封装
  • 参考资料

一、Paramiko

1、安装

pip install paramiko

2、常用的类

SSHClient: 最常用的类,表示一个SSH客户端连接。
SFTPClient: 用于SFTP传输操作。
Transport: 低级别的模块,可用来实现SSH2协议。
SSHClient主要方法
connect(hostname, port=22, username=None, password=None, pkey=None): 用于连接到远程服务器。可以选择使用用户名和密码或密钥进行认证。
exec_command(command): 在远程服务器上执行指令。
open_sftp(): 返回一个SFTPClient对象,可用于文件的上传与下载。
SFTPClient主要方法
get(remotepath, localpath, callback=None): 下载远程文件。
put(localpath, remotepath, callback=None, confirm=True): 上传本地文件。
listdir(path=“.”): 列出远程目录的内容。

3、使用

(1)SSH执行远程命令

import paramiko# 创建SSH客户端
client = paramiko.SSHClient()# 自动添加未知的服务器密钥及策略
'''
AutoAddPolicy:自动添加主机名及主机密钥到本地的known_hosts,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认。最为常用。
WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接。
RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项
'''
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接SSH服务端
'''
hostname(str类型),连接的目标主机地址;
port(int类型),连接目标主机的端口,默认为22;
username(str类型),校验的用户名(默认为当前的本地用户名);
password(str类型),密码用于身份校验或解锁私钥;
pkey(Pkey类型),私钥方式用于身份验证;
key_filename(str or list(str)类型),一个文件名或文件名列表,用于私钥的身份验证;
timeout(float类型),一个可选的超时时间(以秒为单位)的TCP连接;
allow_agent(bool类型),设置为False时用于禁用连接到SSH代理;
look_for_keys(bool类型),设置为False时用于来禁用在~/.ssh中搜索私钥文件;
compress(bool类型),设置为True时打开压缩。
'''
client.connect('192.168.56.10', port=22, username='root', password='vagrant')# 执行命令
stdin, stdout, stderr = client.exec_command('ls -l')# 获取命令执行结果
result = stdout.read()print(result.decode())# 关闭连接
client.close()

(2)SFTP上传/下载文件

import paramiko# 创建SSH客户端
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('192.168.56.10', port=22, username='root', password='vagrant')# 创建SFTP会话
sftp = client.open_sftp()# 上传文件
sftp.put('localfile.txt', '/remote/path/remote.txt')# 下载文件
sftp.get('/remote/path/remote.txt', 'localfile.txt')'''
mkdir,在SFTP服务端创建目录,如sftp.mkdir("/home/userdir",mode=0777),默认模式是0777(八进制),在某些系统上,mode被忽略。在使用它的地方,当前的umask值首先被屏蔽掉。
remove,删除SFTP服务端指定目录,如sftp.remove("/home/userdir")。
rename,重命名SFTP服务端文件或目录,如sftp.rename("/home/test.sh","/home/testfile.sh")
stat,获取远程SFTP服务端指定文件信息,如sftp.stat("/home/testfile.sh")。
listdir,获取远程SFTP服务端指定目录列表,以Python的列表(List)形式返回,如sftp.listdir("/home")。
'''# 关闭SFTP会话和SSH连接
sftp.close()
client.close()

(3)SSH简单封装

import paramikoclass SSHClient:def __init__(self, hostname, port=22, username=None, password=None, pkey=None, use_proxy=False, proxy_hostname=None,proxy_port=None, proxy_username=None, proxy_password=None, timeout=5):"""初始化SSH客户端。:param hostname: 主机名或IP地址:param port: 端口号,默认是22:param username: 用户名:param password: 密码:param pkey: 私钥文件对象,用于密钥认证:param use_proxy: 是否使用代理标志:param proxy_hostname: 代理的主机名称:param proxy_port: 代理的端口号:param proxy_username: 代理的用户名:param proxy_password: 代理的密码"""self.hostname = hostnameself.port = portself.username = usernameself.password = passwordself.pkey = pkeyself.use_proxy = use_proxyself.proxy_hostname = proxy_hostnameself.proxy_port = proxy_portself.proxy_username = proxy_usernameself.proxy_password = proxy_passwordself.client = Noneself.timeout = timeoutdef _setup_proxy(self):"""配置代理。"""if self.use_proxy:proxy_ssh = paramiko.SSHClient()proxy_ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())proxy_ssh.connect(hostname=self.proxy_hostname, port=self.proxy_port, username=self.proxy_username,password=self.proxy_password, timeout=self.timeout)vm_transport = proxy_ssh.get_transport()remote_address = (self.hostname, self.port)local_address = (self.proxy_hostname, self.proxy_port)vm_channel = vm_transport.open_channel("direct-tcpip", remote_address, local_address)return vm_channelelse:return Nonedef _connect(self):"""创建SSH连接。"""self.client = paramiko.SSHClient()self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())proxy = self._setup_proxy()self.client.connect(self.hostname, port=self.port, username=self.username, password=self.password,pkey=self.pkey, sock=proxy, timeout=self.timeout)def exec_command(self, command):"""在远程服务器上执行命令。:param command: 要执行的命令字符串:return: 命令输出结果的标准输出和标准错误"""if self.client is None:self._connect()stdin, stdout, stderr = self.client.exec_command(command)return stdout.read().decode(), stderr.read().decode()def close(self):"""关闭SSH连接。"""if self.client:self.client.close()self.client = None# 使用示例
if __name__ == "__main__":# 直接连接单个服务器'''ssh = SSHClient(hostname='192.168.56.10', port=22, username='root', password='vagrant')stdout, stderr = ssh.exec_command('ls -l')print(stdout)ssh.close()'''# 通过代理连接'''ssh_with_proxy = SSHClient(hostname='hostname', port=22, username='username', password='password', use_proxy=True,proxy_hostname='proxy_hostname', proxy_port=22, proxy_username='proxy_username',proxy_password='proxy_password')stdout, stderr = ssh_with_proxy.exec_command('ls -l')print(stdout)ssh_with_proxy.close()'''# 连接多个服务器执行多个命令servers = {'192.168.56.10': {'port': 22,'username': 'root','password': '123'},'192.168.56.11': {'port': 22,'username': 'root','password': '123'},'192.168.56.12': {'port': 22,'username': 'root','password': '123'},}commands = ['ls -l','cd xxx',]for ip, info in servers.items():ssh = SSHClient(hostname=ip, port=info.get('port'), username=info.get('username'), password=info.get('password'))for command in commands:stdout, stderr = ssh.exec_command(command)print(stdout)ssh.close()

(4)SFTP简单封装

#!/usr/bin/env python
# coding:utf-8
from stat import *
import os
import paramikoclass RemotLHost(object):'''封装一个远程Linux主机类,并将paramiko远程上传下载单个文件或目录的行为封装为其相应的方法'''# 通过IP, 用户名,密码,超时时间初始化一个远程Linux主机def __init__(self, ip, username, password, timeout=30):self.ip = ipself.username = usernameself.password = passwordself.timeout = timeout# transportself.t = None# 链接失败的重试次数self.conn_times = 3# get单个文件def sftp_get(self, remotefile, localfile):t = paramiko.Transport((self.ip, 22))t.connect(username=self.username, password=self.password)sftp = paramiko.SFTPClient.from_transport(t)sftp.get(remotefile, localfile)t.close()# put单个文件def sftp_put(self, localfile, remotefile):t = paramiko.Transport((self.ip, 22))t.connect(username=self.username, password=self.password)sftp = paramiko.SFTPClient.from_transport(t)sftp.put(localfile, remotefile)t.close()# 获取远端linux主机上指定目录及其子目录下的所有文件def __get_all_files_in_remote_dir(self, sftp, remote_dir):# 保存所有文件的列表all_files = list()# 去掉路径字符串最后的字符'/',如果有的话if remote_dir[-1] == '/':remote_dir = remote_dir[0:-1]# 获取当前指定目录下的所有目录及文件,包含属性值files = sftp.listdir_attr(remote_dir)for x in files:# remote_dir目录中每一个文件或目录的完整路径filename = remote_dir + '/' + x.filenameprint("remote file is "+ filename)# 如果是目录,则递归处理该目录,这里用到了stat库中的S_ISDIR方法,与linux中的宏的名字完全一致if S_ISDIR(x.st_mode):all_files.extend(self.__get_all_files_in_remote_dir(sftp, filename))else:all_files.append(filename)return all_filesdef sftp_get_dir(self, remote_dir, local_dir):t = paramiko.Transport((self.ip, 22))t.connect(username=self.username, password=self.password)sftp = paramiko.SFTPClient.from_transport(t)# 获取远端linux主机上指定目录及其子目录下的所有文件all_files = self.__get_all_files_in_remote_dir(sftp, remote_dir)# 依次get每一个文件for x in all_files:filename = x.replace(remote_dir, "")if os.name=="nt":filename = filename.replace('/',os.sep).lstrip(os.sep)local_filename = os.path.join(local_dir, filename)filepath=os.sep.join(local_filename.split(os.sep)[0:-1])if not os.path.exists(filepath):os.mkdir(filepath)print(u'Get  <------- %s'% x)sftp.get(x, local_filename)#获取本地指定目录及其子目录下的所有文件def __get_all_files_in_local_dir(self, local_dir):# 保存所有文件的列表all_files = list()# 获取当前指定目录下的所有目录及文件,包含属性值files = os.listdir(local_dir)for x in files:# local_dir目录中每一个文件或目录的完整路径filename = os.path.join(local_dir, x)# 如果是目录,则递归处理该目录if os.path.isdir(filename):all_files.extend(self.__get_all_files_in_local_dir(filename))else:all_files.append(filename)return all_filesdef sftp_put_dir(self, local_dir, remote_dir):if remote_dir[-1] != '/':remote_dir = remote_dir + "/"t = paramiko.Transport((self.ip, 22))t.connect(username=self.username, password=self.password)sftp = paramiko.SFTPClient.from_transport(t)for root, dirs, files in os.walk(local_dir):for filespath in files:local_file = os.path.join(root, filespath)a=local_file.replace(local_dir, '')if os.name=="nt":a = a.replace('\\','/').lstrip('/')remote_file = os.path.join(remote_dir, a)try:sftp.put(local_file,remote_file)except Exception as e:sftp.mkdir(os.path.split(remote_file)[0])sftp.put(local_file,remote_file)print("Put %s to remote %s" % (local_file, remote_file))for name in dirs:local_path = os.path.join(root, name)a = local_path.replace(local_dir, '')if os.name=="nt":a = a.replace('\\','/').lstrip('/')remote_path = os.path.join(remote_dir, a)try:sftp.mkdir(remote_path)print("mkdir path %s" % remote_path)except Exception as e:print(e)t.close()if __name__ == '__main__':host = RemotLHost('192.168.56.10', 'root', 'vagrant')remote_path = '/root/doc'local_path = 'D:\\test'# 将远端remote_path目录中的所有文件get到本地local_path目录host.sftp_get_dir(remote_path, local_path)# 将本地local_path目录中的所有文件put到远端remote_path目录local_path= 'D:\ltest'remote_path = '/root/doc2'host.sftp_put_dir(local_path, remote_path)

参考资料

https://blog.csdn.net/weixin_41238626/article/details/138603792

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1551905.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

大屏娱乐体验新标杆:海信发布全新一代AI电视

在金秋送爽的9月29日&#xff0c;海信以一场盛大的“BIG PLAN百吋风暴”秋季新品发布会&#xff0c;正式揭开了AI电视新时代的序幕。 作为本场发布会上最耀眼的明星&#xff0c;海信AI电视E7N系列凭借无与伦比的AI画质技术和极致性能&#xff0c;引领大屏娱乐体验迈入全新境界&…

仿真设计|基于51单片机的多模式音乐跑马灯

目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现&#xff08;protues8.7&#xff09; 程序&#xff08;Keil5&#xff09; 全部内容 资料获取 具体实现功能 1、16个发光二极管做跑马灯&#xff0c;跑马灯有10种模式。 2、按键可以切换跑马灯模式&#xff0…

Java笔试02

在网络操作系统中&#xff0c;TCP和UDP是传输层中两个非常重要的协议。TCP提供的是面向连接的、可靠的端到端通信机制&#xff0c;因此TCP协议在注重数据安全的场景下获得了极为广泛的应用。 TCP采用了确认和重发机制来确保数据的可靠传输。 相较于UDP&#xff0c;TCP的优势在…

.NET CORE程序发布IIS后报错误 500.19

发布IIS后浏览时报错误500.19&#xff0c;同时配置文件web.config的路径中也存在问号“?”。 可能原因&#xff1a;没有安装运行时

无人机之编队控制篇

无人机编队控制是指无人机集群在执行任务过程中&#xff0c;如何形成并保持一定的几何构型&#xff0c;以适应平台性能、战场环境、战术任务等要求的控制技术。以下是对无人机编队控制的详细解析&#xff1a; 一、无人机编队控制的主要任务 无人机编队控制主要解决两个问题&a…

Linux 线程同步

前言 上一期我们介绍了线程互斥&#xff0c;并通过加锁解决了多线程并发访问下的数据不一致问题&#xff01;本期我们来介绍一下同步问题&#xff01; 目录 前言 一、线程同步 • 线程同步的引入 • 同步的概念 理解同步和饥饿问题 • 条件变量 理解条件变量 • 同步…

系列一、初始ElasticSearch

前言&#xff1a; 最近公司的业务有用到ElasticSearch&#xff0c;虽然说之前业余时间也自学过ElasticSearch技术&#xff0c;但是在公司实际的业务中开发中没有用过&#xff0c;再加上时间比较久远了&#xff0c;很多东西都忘记了&#xff0c;基于此我决定系统的重新学习一下这…

个人项目简单https服务配置

1.SSL简介 SSL证书是一种数字证书&#xff0c;由受信任的证书颁发机构&#xff08;CA&#xff09;颁发&#xff0c;用于在互联网通信中建立加密链接。SSL代表“安全套接层”&#xff0c;是用于在互联网上创建加密链接的协议。SSL证书的主要目的是确保数据传输的安全性和隐私性…

鸿蒙NEXT开发环境搭建(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

PMP--三模--解题--51-60

文章目录 14.敏捷--每日站会--内容--• 上次站会以来我都完成了什么&#xff1f;• 从现在到下一次站会&#xff0c;我计划完成什么&#xff1f;• 我的障碍&#xff08;或风险或问题&#xff09;是什么&#xff1f;--每日站会能够同步与协调相关的活动。14.敏捷--Scrum板 Scru…

【Ubuntu】VMware中虚拟网卡与服务器网卡的绑定

文章目录 服务器网卡和VMware中虚拟网卡的绑定1.在本机上查看需要的网卡名称2.服务器本机设置固定ip3.打开VMware后&#xff0c;将虚拟网卡与本机真实网卡进行绑定。4.给routeOS分配4张网卡&#xff0c;如图所示&#xff1a;5.ubuntu1和ubuntu2只需分配vmnet0和vmnet8即可&…

《More Effective C++》的学习

引用与指针 没有所谓的null reference reference一定需要代表某个对象&#xff0c;所以C要求reference必须有初值。 QString &s; 使用reference可能比使用pointer更高效。 因为reference一定是有效的&#xff0c;而指针可能为空&#xff08;需要多加一个判断&#xff0…

【PyTorch】图像目标检测

图像目标检测是什么 Object Detection 判断图像中目标的位置 目标检测两要素 分类&#xff1a;分类向量 [p0, …, pn]回归&#xff1a;回归边界框 [x1, y1, x2, y2] 模型如何完成目标检测 将3D张量映射到两个张量 分类张量&#xff1a;shape为 [N, c1]边界框张量&#xf…

索尼MDR-M1:超宽频的音频盛宴,打造沉浸式音乐体验

在音乐的世界里&#xff0c;每一次技术的突破都意味着全新的听觉体验。 索尼&#xff0c;作为音频技术的先锋&#xff0c;再次以其最新力作——MDR-M1封闭式监听耳机&#xff0c;引领了音乐界的新潮流。 这款耳机以其超宽频播放和卓越的隔音性能&#xff0c;为音乐爱好者和专…

深蕾半导体参加2024年度上海设计100+全球竞赛展览WDCC

展览介绍 WDCC2024 上海于2010年加入联合国教科文组织“创意城市网络”&#xff0c;定名为“设计之都”。“上海设计100”全球竞赛&#xff0c;遴选推广优秀设计案例&#xff0c;将“设计之都”的规划和愿景具体呈现。 ——展出时间、地点见文末—— 深蕾参展 深圳前海深蕾…

初识Linux · 进程等待

目录 前言&#xff1a; 进程等待是什么 为什么需要进程等待 进程等待都在做什么 前言&#xff1a; 通过上文的学习&#xff0c;我们了解了进程终止&#xff0c;知道终止是在干什么&#xff0c;终止的三种情况&#xff0c;以及有了退出码&#xff0c;错误码的概念&#xff…

Python | Leetcode Python题解之第448题找到所有数组中消失的数字

题目&#xff1a; 题解&#xff1a; class Solution:def findDisappearedNumbers(self, nums: List[int]) -> List[int]:n len(nums)for num in nums:x (num - 1) % nnums[x] nret [i 1 for i, num in enumerate(nums) if num < n]return ret

【RocketMQ】秒杀设计与实现

&#x1f3af; 导读&#xff1a;本文档详细探讨了高并发场景下的秒杀系统设计与优化策略&#xff0c;特别是如何在短时间内处理大量请求。文档分析了系统性能指标如QPS&#xff08;每秒查询率&#xff09;和TPS&#xff08;每秒事务数&#xff09;&#xff0c;并通过实例讲解了…

鸿蒙开发(NEXT/API 12)【申请接入Wear Engine服务】 穿戴服务

申请Wear Engine服务前&#xff08;开发者需实名认证为个人开发者或者企业开发者&#xff0c;认证前&#xff0c;请先了解二者的[权益区别] &#xff09;&#xff0c;确认开发环境并完成创建项目、创建HarmonyOS应用等基本准备工作&#xff0c;再继续进行以下开发活动。 进入华…

JVM(HotSpot):字符串常量池(StringTable)

文章目录 一、内存结构图二、案例讲解三、总结 一、内存结构图 JDK1.6 JDK1.8 我们发现&#xff0c;StringTable移入了Heap里面。所以&#xff0c;应该想到&#xff0c;StringTable将受到GC管理。 其实&#xff0c;1.6中&#xff0c;在方法区中的时候&#xff0c;也是受GC管…