• 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()
  • 相关阅读:
    违反并发性: UpdateCommand 影响了预期1条记录中的0条——我的解决方案
    (转)使用DataGridView控件常见问题解答
    C#中如何去除数组中重复的项
    C#中如何去除HTML标记
    (转)中断基本概念
    JavaScript 操作 Cookie
    要有梦想创造卓越的职业生涯
    《暗时间》读书笔记与读后感
    前端攻略系列
    前端攻略系列(一) 前端各种优化(保证持续更新)
  • 原文地址:https://www.cnblogs.com/cyfiy/p/9390936.html
Copyright © 2020-2023  润新知