zoukankan      html  css  js  c++  java
  • paramiko:实现ssh协议,对linux服务器资源的访问

    介绍

    网络传输是遵循协议的,比如SSH,paramiko则是实现了SSHv2协议的一个python库(底层使用的是cryptography)。有了paramiko之后,我们便可以通过python使用ssh协议来连接远程服务器执行操作,不用再通过xshell等工具。安装也很简单,直接pip install paramiko即可

    paramiko包含两大核心组件:SSHClient和SFTPClient

    • SSHClient的作用类似于Linux下的ssh命令,是对SSH会话的封装,该类封装了传输(transport),通道(channel)及SFTPClient建立的方法(open_sftp)等等、通常用于执行远程命令

      transport:是一种加密的会话,使用时会同步创建了一个加密的Tunnels(通道),这个Tunnels叫做Channel
      channel:是一种类Socket,一种安全的SSH传输通道
      session:是client与Server保持连接的对象,用connect()/start_client()/start_server()开始会话
      
    • SFTPClient的作用类似于Linux下的sftp命令,是对SFTP客户端的封装,用于实现远程文件操作,如:文件上传、下载、修改文件权限等操作


    SSHClient的使用

    一般都会先创建一个客户端实例,client = paramiko.SSHClient(),然后这个client下有很多方法

    • connect():实现远程服务器的连接与认证

      def connect(
          self,
          hostname,  
          port=SSH_PORT,
          username=None,
          password=None,
          pkey=None,
          key_filename=None,
          timeout=None,
          allow_agent=True,
          look_for_keys=True,
          compress=False,
          sock=None,
          gss_auth=False,
          gss_kex=False,
          gss_deleg_creds=True,
          gss_host=None,
          banner_timeout=None,
          auth_timeout=None,
          gss_trust_dns=True,
          passphrase=None,
      ):
      常用参数:
      hostname:连接的目的主机,这个参数是必须的
      port=SSH_PORT:指定端口,默认是22
      username=None:验证的用户名
      password=None:验证的用户密码
      pkey=None:私钥方式用于身份验证
      key_filename=None:一个文件名或者文件列表,指定私钥文件
      timeout=None:可选的tcp连接超时时间
      allow_agent=True:是否允许连接到ssh代理,默认为True
      look_for_keys=True 是否在~/.ssh中搜索私钥文件,默认为True 允许
      compress=False, 是否打开压缩
      
    • set_missing_host_key_policy():设置远程服务器没有在know_hosts文件中记录时的应对策略。目前支持三种策略:

      设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种:
       
      AutoAddPolicy 自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认
      WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接
      RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项
      
    • exec_command():在远程服务器执行Linux命令的方法。

    • open_sftp():在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象。

      # 利用SSHClient对象的open_sftp()方法,可以直接返回一个基于当前连接的sftp对象,可以进行文件的上传等操作.
       
      sftp = client.open_sftp()
      sftp.put('1.txt','2.txt')
      
    import paramiko
    
    # 实例化SSHClient
    client = paramiko.SSHClient()
    
    # 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
    # 连接SSH服务端,以用户名和密码进行认证
    client.connect(hostname='47.94.174.89', port=22, username='root', password='zgdasdas223')
    
    # 打开一个Channel并执行命令
    stdin, stdout, stderr = client.exec_command('ls / ')  # stdout 为正确输出,stderr为错误输出,同时是有1个变量有值
    
    # 打印执行结果
    print(stdout.read().decode('utf-8'))
    """
    bin
    boot
    dev
    etc
    home
    lib
    lib64
    lost+found
    media
    mnt
    opt
    proc
    root
    run
    sbin
    srv
    sys
    tmp
    usr
    var
    """
    
    # 关闭SSHClient
    client.close()
    
    import paramiko
    
    # 实例化SSHClient
    client = paramiko.SSHClient()
    
    # 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
    # 连接SSH服务端,以用户名和密码进行认证
    client.connect(hostname='47.94.174.89', port=22, username='root', password='zggdsadsa13')
    
    # 打开一个Channel并执行命令
    stdin, stdout, stderr = client.exec_command('dsadasdasdas ')  # stdout 为正确输出,stderr为错误输出,同时是有1个变量有值
    
    # 打印执行结果
    print(stderr.read().decode('utf-8'))
    """
    bash: dsadasdasdas: command not found
    """
    
    # 关闭SSHClient
    client.close()
    


    SFTPClient的使用

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

    from_transport(cls,t) 创建一个已连通的SFTP客户端通道
    put(localpath, remotepath, callback=None, confirm=True) 将本地文件上传到服务器 参数confirm:是否调用stat()方法检查文件状态,返回ls -l的结果
    get(remotepath, localpath, callback=None) 从服务器下载文件到本地
    mkdir() 在服务器上创建目录
    remove() 在服务器上删除目录
    rename() 在服务器上重命名目录
    stat() 查看服务器文件状态
    listdir() 列出服务器目录下的文件
    
    import paramiko
    
    # 获取transport实例
    transport = paramiko.Transport(("47.94.174.89", 22))
    
    # 连接ssh,通过username和password
    transport.connect(username="root", password="dasdsadas3")
    
    # 获取SFTP实例
    sftp = paramiko.SFTPClient.from_transport(transport)
    
    # 执行下载文件
    sftp.get("/root/dockerfile", "dockerfile")
    
    # 执行上传文件
    sftp.put("1.py", "/root/11.py")
    
    
    transport.close()
    
  • 相关阅读:
    SourceTree使用教程(六)--回滚版本到某次提交
    SourceTree使用教程(四)---冲突解决
    Git 分支合并后回退的几种情况分析
    HTTP认证之基本认证——Basic(二) _
    C#3.0中自动属性和对象初始化器
    C# 3.0新特征之创建和初始化集合对象
    SQL 用多个条件进行排序;以及根据一个条件的多个值,进行排序
    如何修改 .NET Core Kestrel 下的端口
    存储过程
    mysql临时表用法分析【查询结果可存在临时表中】
  • 原文地址:https://www.cnblogs.com/traditional/p/11142268.html
Copyright © 2011-2022 走看看