系统批量运维管理paramiko
admin
2023-07-17 03:02:37
0次

paramiko是基于Python实现的SSH2远程安全连接,支持认证及密钥方式。可以实现远程命令执行、文件传输、中间SSH代理等功能,相对于Pexpect,封装的层次更高,更贴近SSH协议的功能,官网地址:http://www.paramiko.org


一:核心组件

SSHClient类:

SSHClient类是SSH服务会话的高级表示,该类封装了传输(transport)、通道(channel)及SFTPClient的校验、建立的方法,通常用于执行远程命令


1  connect方法connect方法实现了远程SSH连接并校验。方法定义:connect(self, hostname, port=22, username=None, password=None, pkey=None, key_filename=None, timeout=None, allow_agent=True, look_for_keys=True, compress=False)

参数说明:

  • 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时打开压缩。


2  exec_command方法远程命令执行方法,该命令的输入与输出流为标准输入(stdin)、输出(stdout)、错误(stderr)的Python文件对象

    远程命令执行方法,该命令的输入与输出流为标准输入(stdin)、输出(stdout)、错误(stderr)的Python文件对象

参数说明:

  • command(str类型),执行的命令串;   

  • bufsize(int类型),文件缓冲区大小,默认为-1(不限制)


3. load_system_host_keys方法

    加载本地公钥校验文件,默认为~/.ssh/known_hosts,非默认路径需要手工指定,方法定义:load_system_host_keys(self,filename=None)参数说明:filename(str类型),指定远程主机公钥记录文件。


4. set_missing_host_key_policy方法设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种,分别是AutoAddPolicy、RejectPolicy(默认)、Warning-Policy,仅限用于SSHClient类,分别代表的含义如下:

  • AutoAddPolicy,自动添加主机名及主机密钥到本地HostKeys对象,并将其保存,不依赖load_system_host_keys()的配置,即使~/.ssh/known_hosts不存在也不产生影响;  

  • RejectPolicy,自动拒绝未知的主机名和密钥,依赖load_system_host_keys()的配置;   

  • WarningPolicy,用于记录一个未知的主机密钥的Python警告,并接受它,功能上与Au-toAddPolicy相似,但未知主机会有告警。


下面介绍一个简单实现远程SSH运行命令的示例。该示例使用密码认证方式,通过exec_com-mand()方法执行命令,详细源码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import paramiko
hostname="18.16.200.191"
username="root"
password="shitouit@2017"
paramiko.util.log_to_file('syslogin.log')

ssh = paramiko.SSHClient()
#ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())      #设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,AutoAddPolicy,自动添加主机名及主机密钥到本地HostKeys对象,并将其保存,不依赖load_system_host_keys()的配置,即使~/.ssh/known_hosts不存在也不产生影响
ssh.connect(hostname=hostname,username=username,password=password)

stdin,stdout,stderr=ssh.exec_command('free -m')
print stdout.read()
ssh.close()

程序执行结果截图如下:

系统批量运维管理paramiko


SFTPClient类:

  SFTPClient作为一个SFTP客户端对象,根据SSH传输协议的sftp会话,实现远程文件操作,比如文件上传、下载、权限、状态等操作

1. from_transport方法

   创建一个已连通的SFTP客户端通道,方法定义:from_transport(cls, t)

   参数说明:t(Transport),一个已通过验证的传输对象

   

2. put方法

   上传本地文件到远程SFTP服务端,方法定义:put(self, localpath, remotepath, callback=None, confirm=True)

   参数说明:   

   localpath(str类型),需上传的本地文件(源);   

   remotepath(str类型),远程路径(目标);   

   callback(function(int, int)),获取已接收的字节数及总传输字节数,以便回调函数调用,默认为None;   confirm(bool类型),文件上传完毕后是否调用stat()方法,以便确认文件的大小。

3. get方法

   从远程SFTP服务端下载文件到本地,方法定义:get(self, remotepath, localpath, callback=None)

   参数说明:   

   remotepath(str类型),需下载的远程文件(源);   

   localpath(str类型),本地路径(目标);   

   callback(function(int, int)),获取已接收的字节数及总传输字节数,以便回调函数调用,默认为None。

4. 其他方法

   SFTPClient类其他常用方法说明:   

   Mkdir,在SFTP服务器端创建目录,如sftp.mkdir("/home/userdir",0755)。   

   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")。

下面为SFTPClient类的一个完整示例,实现了文件上传、下载、创建与删除目录等,需要注意的是,put和get方法需要指定文件名:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import paramiko
hostname="18.16.200.191"
username="root"
password="shitouit@2017"
port=22

try:
    t=paramiko.Transport((hostname, port))
    t.connect(username=username,password=password)
    sftp = paramiko.SFTPClient.from_transport(t)
    sftp.put('/root/anaconda-ks.cfg','/data/anaconda-ks.cfg')           #上传文件
    sftp.get('/root/harbor-online-installer-v1.5.2.tgz','/root/harbor-online-installer-v1.5.2.tgz')    #下载文件
    sftp.mkdir('/data/parami',0755)
    sftp.rmdir('/data/parami')
    sftp.rename('/root/1.sh','/root/2.sh')
    print sftp.stat('/root/2.sh')
    print sftp.listdir('/data/')
    t.close()
except Exception, e:
    print str(e)


相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...