• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python基于paramiko库远程执行 SSH 命令,实现 sftp 下载文件

    楔子

    我们使用 Python 避免不了和 Linux 打交道,而有时我们需要执行一些 shell 命令。如果在本地的话,那么可以通过调用 os.system 或者 subprocess.Popen 来执行,但如果我们希望远程执行其它机器上的 shell 命令,这个时候该怎么做呢?下面我们就来推荐一个第三方库 paramiko,看看如何使用 Python 远程操作其它机器。

    paramiko

    网络传输是遵循协议的,比如 SSH,paramiko 则是实现了 SSHv2 协议的一个 Python 第三方库(底层使用的是 cryptography)。有了 paramiko 之后,我们便可以通过 Python 使用 SSH 协议来连接远程服务器执行操作,和 xshell 本质上是类似的。

    注意:我们在 Python 代码中是直接通过 SSH 协议对远程服务器执行操作,而不是调用 ssh 命令对远程服务器进行操作。

    既然要使用,那么首先要安装,直接 pip install paramiko 即可。

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

    SSHClient 的作用类似于 Linux 下的 ssh 命令,是对 SSH 会话的封装,通常用于执行远程命令。

    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,
     disabled_algorithms=None,
    ):
     """"""

    里面参数很多,但常用的参数如下:

    set_missing_host_key_policy:当远程服务器没有本地秘钥或 HostKeys 对象时的应对策略,目前支持三种:

    所以我们一般都会将策略改成 AutoAddPolicy,不然还需要在本地进行配置。

    exec_command:远程执行的具体 Linux 命令

    open_sftp:在当前 ssh 会话的基础上创建一个 sftp 会话,该方法会返回一个 SFTPClient 对象,可以执行文件的上传、下载等操作。我们后面在 SFTPClient 的时候会说。

    下面我们来演示一下:

    import paramiko
    
    # 实例化 SSHClient
    client = paramiko.SSHClient()
    
    # 自动添加策略, 保存服务器的主机名和密钥信息; 如果不添加, 那么不再本地 know_hosts 文件中的主机将无法连接
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
    # 连接 SSH 服务端, 通过用户名和密码进行认证
    # 该过程会创建一个 session, 它是 client 和 server 保持连接的对象
    client.connect(hostname='47.94.174.89', port=22, username='root', password='xxxxxxx')
    
    # 执行远程命令, 该方法会打开一个 paramiko.Channel 对象(类 socket, 一种安全的 SSH 传输通道)
    # 会返回三个值, 分别是 stdin(标准输入)、stdout(标准输出)、stderr(错误输出)
    stdin, stdout, stderr = client.exec_command("ls /")
    
    # 打印执行结果, 显然我们要通过 stdout 来查看, 我们可以调用 stdout.read 获取执行的结果
    # 但是返回的是字节, 所以需要先获取对应的编码, 然后再进行 decode
    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()

    还是很简单的,如果我们输入了一条错误的命令,那么 stdout 里面就不会有内容了,因为错误信息会保存是在 stderr 中。

    import paramiko
    
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(hostname='47.94.174.89', port=22, username='root', password='xxxxxxx')
    stdin, stdout, stderr = client.exec_command("xxxxx")
    print(stderr.read().decode("utf-8"))
    """
    bash: xxxxx: command not found
    
    """
    client.close()

    SFTPClient 的使用

    SFTPClient 作为一个 sftp 的客户端对象,根据 ssh 传输协议的 sftp 会话,可以实现远程文件的操作,例如:上传、下载、查看权限和状态等等。

    import paramiko
    
    # 创建一个 Transport 对象, 使用时会同步创建一个 paramiko.Channel 对象
    # 参数传递一个由 IP 和 PORT 组成的元组即可
    transport = paramiko.Transport(("47.94.174.89", 22))
    
    # 连接 ssh, 通过 username 和 password
    transport.connect(username="root", password="xxxxxxx")
    
    # 获取 SFTPClient 实例, 它便相当于 Linux 下的 sftp, 我们通过它可以进行文件的一些操作
    sftp = paramiko.SFTPClient.from_transport(transport)

    以上我们便得到的 sftp,那么它都支持哪些操作呢?

    常用的大概以上这些,我们来演示一下。

    # 1. 改变工作区
    sftp.chdir("/usr/local/bin")
    
    # 2. 查看工作区
    print(sftp.getcwd()) # /usr/local/bin
    sftp.chdir("/root")
    print(sftp.getcwd()) # /root
    """
    如果不调用 sftp.chdir(path) 的时候, 那么打印 sftp.getcwd() 时结果为 None
    但我们知道登陆 Linux 时, 默认会在 /root 目录(对于 root 用户而言)
    对于当前的 sftp 而言也确实如此, 只不过打印 sftp.getcwd() 的时候结果为 None 罢了 
    """
    
    # 3. 列出当前目录下的文件
    print(sftp.listdir("/usr/local")) # ['lib', 'lib64', 'games', 'aegis', ...]
    
    # 4. 查看文件或目录状态
    print(sftp.stat("/root/.ssh/authorized_keys"))
    """
    -rw------- 1 0  0    0 16 Dec 13:26 ?
    """
    
    # 5. 改变权限
    sftp.chmod("/root/.ssh/authorized_keys", 0o777)
    print(sftp.stat("/root/.ssh/authorized_keys"))
    """
    -rwxrwxrwx 1 0  0    0 16 Dec 13:26 ?
    """
    
    # 6. 创建目录
    print("dir" in sftp.listdir("/root")) # False
    sftp.mkdir("/root/dir", mode=0o777)
    print("dir" in sftp.listdir("/root")) # True
    
    # 7. 删除目录
    sftp.rmdir("/root/dir")
    print("dir" in sftp.listdir("/root")) # False
    
    # 8. 删除文件
    sftp.remove("/root/1.py")
    
    # 9. 下载文件
    sftp.get("/root/makefile", r"makefile")
    
    # 10. 上传文件
    sftp.put("dockerfile", "/root/dockerfile")
    
    # 最后关闭 sftp 和 transport
    sftp.close()
    transport.close()

    当然我们在介绍 SSHClient 的时候说过,还可以通过 open_sftp 的方式来创建 sftp 客户端。

    import paramiko
    
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(hostname='47.94.174.89', port=22, username='root', password='xxxxxxx')
    # 这种方式创建也是可以的
    sftp = client.open_sftp()

    以上就是python基于paramiko库远程执行 SSH 命令,实现 sftp 下载文件的详细内容,更多关于python paramiko库的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • 用Python自动下载网站所有文件
    • Python解析m3u8拼接下载mp4视频文件的示例代码
    • python爬虫智能翻页批量下载文件的实例详解
    • python 下载文件的几种方法汇总
    • python 基于selectors库实现文件上传与下载
    • Python实现FTP文件定时自动下载的步骤
    • Python 使用SFTP和FTP实现对服务器的文件下载功能
    • python从ftp获取文件并下载到本地
    • Python根据URL地址下载文件并保存至对应目录的实现
    • python 下载文件的几种方式分享
    上一篇:python之 matplotlib和pandas绘图教程
    下一篇:python 实现循环定义、赋值多个变量的操作
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    python基于paramiko库远程执行 SSH 命令,实现 sftp 下载文件 python,基于,paramiko,库,远程,