zoukankan      html  css  js  c++  java
  • Python 堡垒机编程之Paramiko

    关于paramiko模块

    paramiko是基于Python实现的ssh2远程安全连接,支持认证及密钥方式远程执行命令、文件传输,中间ssh代理等

    安装好之后,用paramiko模块写一个简单的远程ssh运行命令,代码如下:

    import paramiko
    
    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接远程服务器
    ssh.connect(hostname='192.168.189.136',port=22,username='root',password='Admin123 ')
    
    # 执行命令
    stdin,stdout,stderr = ssh.exec_command('df -h')
    # 获取命令结果
    result = stdout.read()
    
    # 打印结果
    print(result.decode())
    
    #关闭连接
    ssh.close()

    paramiko的核心组件:

    1. SSHClient

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

    connect(self, hostkey=None, username='', password=None, pkey=None,gss_host=None, gss_auth=False, gss_kex=False, gss_deleg_creds=True)

    参数说明:

    • hostname(str类型):连接的目标主机地址
    • port(int类型):连接目标主机的端口,默认为22
    • username(str类型):用户名
    • password(str类型):密码
    • pkey(PKey类型):私钥方式,用于身份验证
    • gass_host(str类型): The target's name in the kerberos database. Default: hostname
    • gss_auth(布尔类型):是否使用GSS-API认证
    • ss_kex=False(布尔类型):是否将GSS-API key和用户认证交换
    • gss_deleg_creds(布尔类型):是否代表包含GSS-API 客户端的凭据

    exec_command(self,command,bufsize=-1,timeout=None,get_pty=False,environment=None)

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

    load_system_host_keys方法

    load_host_keys(self, filename)

    加载本地总要校验文件,默认为~/.ssh/known_hosts,非默认另需要手工指定。

    参数说明:

    • filename(str类型)指定远程主机公钥记录文件

    set_missing_host_key_policy(self, policy)

    设置连接的远程主机没有本地主机秘钥或HostKeys对象时的策略,目前支持三种,分别是:AutoAddPolicy、RejectPolicy(默认)、WarningPolicy,三者的含义如下:

    • AutoAddPolicy自动添加主机名及主机秘钥到本地HostKeys对象,并将其保存,不依赖load_system_host_keys()的配置,即使~/.ssh/known_hosts不存在也不产生影响
    • RejectPolicy自动拒绝位置的主机名和秘钥,依赖load_system_host_keys()的配置
    • WarningPolicy用于记录一个位置的主机秘钥的python警告,并接受它,功能上与AutoAddPolicy相似,但未知主机会有警告

    2. SFTPClient类

    SFTPClient根据SSH传输协议的sftp命令会话,实现远程文件操作:文件的上传、下载、权限、状态等操作。有以下方法:

    from_transport(cls, t, window_size=None, max_packet_size=None)

    参数说明:

    • t:一个已经通过验证的传输对象

    例子:

    transport = paramiko.Transport(('192.168.1.23',22))
    transport.connect(username="root",password="123456")
    sftp = paramiko.SFTPClient.from_transport(transport)

    put(self, localpath, remotepath, callback=None, confirm=True)

    长传本地文件到远程SFTP服务端

    参数说明:

    • localpath(str类型):需要上传的本地文件(源文件)
    • remotepath(str类型):远程路径(目标文件)
    • callback(function(init,init)):获取已接收的字节数及总传输字节数,以便回调函数调用,默认为None
    • confirm(bool类型):文件长传完毕后是否调用start()方法,以便确认文件的大小

    get(self, remotepath, localpath, callback=None)

    从远程SFTP服务端下载本地

    参数说明:

    • remotepath(str类型):需要下载的远程文件
    • localpath(str类型):本地路径
    • callback(function(init,init)): 获取已接收的字节数及总传输字节数,以便回调函数调用,默认为None

    其他方法:

    • SFTPClient类其他常用方法:
    • Mkdir:在SFTP服务端创建目录
    • remove:删除SFTP服务端指定目录
    • rename:重命名SFTP服务端文件或目录
    • stat:获取远程SFTP服务端指定文件的信息
    • listdir:获取远程SFTP服务端指定目录列表,以Python的列表形式返回

    下面是实际的代码例子

    基于账户名和密码的上传和下载文件:

    import paramiko
    
    #t就相当于创建通道
    
    t = paramiko.Transport(("192.168.1.23",22))
    
    t.connect(username="root",password="123456")
    
    #这里表示sftp通过t这个通道传输数据
    
    sftp = paramiko.SFTPClient.from_transport(t)
    
    #sftp.put("ssh例子.py","/tmp/aaa.py")
    
    sftp.get("/tmp/aaa.py","sss")
    
    sftp.close()
  • 相关阅读:
    标签的讲解
    属性分类
    LeetCode 003. 无重复字符的最长子串 双指针
    Leetcode 136. 只出现一次的数字 异或性质
    Leetcode 231. 2的幂 数学
    LeetCode 21. 合并两个有序链表
    象棋博弈资源
    acwing 343. 排序 topsort floyd 传播闭包
    Leetcode 945 使数组唯一的最小增量 贪心
    Leetcode 785 判断二分图 BFS 二分染色
  • 原文地址:https://www.cnblogs.com/cyfiy/p/9390936.html
Copyright © 2011-2022 走看看