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

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

  • 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:当远程服务器没有本地秘钥或 HostKeys 对象时的应对策略,目前支持三种:

  • AutoAddPolicy:自动添加主机名以及主机秘钥到本地 HostKeys 对象, 不依赖 load_system_host_key 的配置, 即新建立 ssh 连接时不需要再输入 yes 或 no 进行确认
  • WarningPolicy:用于记录一个未知的主机秘钥的 Python 警告、并且接收; 所以它的功能和 AutoAddPolicy 是类似的, 只不过会提示这是新连接
  • RejectPolicy:自动拒绝未知的主机名和秘钥, 依赖 load_system_host_key 的配置, 该选项为默认选项

所以我们一般都会将策略改成 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,那么它都支持哪些操作呢?

  • put(self, localpath, remotepath, callback=None, confirm=True):将本地文件上传到服务器, callback 表示回调函数, 上传成功后调用; confirm 表示是否调用 stat 方法检查文件状态, 返回 ls -l 的结果
  • get(self, remotepath, localpath, callback=None):将文件从服务器下载到本地
  • mkdir(self, path, mode=o777):在服务器上创建目录, mode 表示权限, 默认为 511(o777 是一个变量, 等于 511)
  • rmdir(self, path):删除服务器上的目录
  • remove(self, path):删除服务器上的文件
  • rename(self, oldpath, newpath):对服务器上目录进行重命名
  • stat(self, path):查看文件或目录的状态
  • listdir(self, path='.'):列出服务器目录下的文件
  • getcwd(self):查看工作区, 也就是当前所在路径
  • chmod(self, path, mode):改变权限
  • chown(self, path, uid, gid): 改变用户和组
  • chdir(self, path):改变工作区

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

# 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库的资料请关注我们其它相关文章!

(0)

相关推荐

  • 浅谈python之自动化运维(Paramiko)

    简介 使用开源的Paramiko,我们就可以用Python代码中通过SSH协议对远程服务器执行操作,不需要手敲ssh命令,从而实现自动化运维. ssh是一个协议,OpenSSH是其中一个开源实现,paramiko库,实现了SSHv2协议(底层使用cryptography). 项目文档:点我跳转 扩展:ssh协议,OpenSSH 上手 1.安装 pip install paramiko 2.导入模块 import paramiko 3.使用 def initSshClinet(): ''' 初始化

  • Python使用paramiko连接远程服务器执行Shell命令的实现

    需求 在自动化测试场景里, 有时需要在代码里获取远程服务器的某些数据, 或执行一些查询命令,如获取Linux系统版本号 \ 获取CPU及内存的占用等, 本章记录一下使用paramiko模块SSH连接服务器的方法 1. 先安装paramiko库 pip3 install paramiko 2. 代码 #!/usr/bin/env python # coding=utf-8 """ # :author: Terry Li # :url: https://blog.csdn.net

  • python 第三方库paramiko的常用方式

    介绍 paramiko是什么可以参考其他人的博客或文章,这里不再赘述,直入正题. 本次测试的版本信息如下: python 3.9 paramiko 2.7.2 centos 8 三种常用方式 paramiko 的三种常用方式如下: 使用密码进行登录 使用密钥免密码登录 SFTP 传输文件 其中最割裂的就是SFTP 传输文件,很多文章登陆使用SSHClient类,传输文件使用Transport类,我也是这样用了很长时间. 如果你也是这么用的,你没有啥想法吗?用python就是节约心智,怎么一个变形

  • python 使用paramiko模块进行封装,远程操作linux主机的示例代码

    import time import paramiko class HandleParamiko: ''' 定义一个linux处理类 ''' def __init__(self, hostname, password, port=22, username='root'): ''' 构造器 :param hostname: 主机ip,type:str :param password: 密码,type:str :param port: 端口,type:int 默认22 :param username

  • 解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题

    Python - paramiko 模块远程执行ssh 命令 nohup 不生效的问题解决 1.使用 paramiko 模块ssh 登陆到 linux 执行nohup命令不生效 # 执行命令 def command(ssh_config, cmd, result_print=None, nohup=False): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.con

  • python使用paramiko实现ssh的功能详解

    个人认为python的paramiko模块是运维人员必学模块之一,其ssh登录功能是旅行居家必备工具. 安装paramiko很简单,pip install paramiko就搞定了,其依赖库会被一并安装. paramiko的官方站点在这里:http://www.paramiko.org/.有需要深入研究的可以阅读官方文档. paramiko模块提供了ssh及sft进行远程登录服务器执行命令和上传下载文件的功能. 一.基于用户名和密码的 sshclient 方式登录 # 建立一个sshclient

  • Python如何实现Paramiko的二次封装

    Paramiko是一个用于执行SSH命令的Python第三方库,使用该库可实现自动化运维的所有任务,如下是一些常用代码的封装方式,多数代码为半成品,只是敲代码时的备份副本防止丢失,仅供参考. 目前本人巡检百台设备完全无压力,如果要巡检过千台则需要多线程的支持,过万台则需要加入智能判断等. 实现命令执行: 直接使用过程化封装,执行CMD命令. import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(par

  • python利用paramiko实现交换机巡检的示例

    直接上代码 #-*- coding:UTF-8 -*- import paramiko import time starttime = time.strftime('%Y-%m-%d %T') start_info = "巡检开始时间:"+str(starttime) cmd_filepath = r"d:\Python\py\xunjian\cmd.txt" cmd_file = open(cmd_filepath,"r") cmds = cm

  • python中使用paramiko模块并实现远程连接服务器执行上传下载功能

    paramiko模块 paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,如Linux, Solaris, BSD, MacOS X, Windows等,paramiko都可以支持,因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,par

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

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

  • python利用paramiko连接远程服务器执行命令的方法

    python中的paramiko模块是用来实现ssh连接到远程服务器上的库,在进行连接的时候,可以用来执行命令,也可以用来上传文件. 1.得到一个连接的对象 在进行连接的时候,可以使用如下的代码: def connect(host): 'this is use the paramiko connect the host,return conn' ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddP

  • python基于pexpect库自动获取日志信息

    1. 前言 对大部分的人来说,解决 Bug 都是依靠关键字去日志去定位问题! 在调试情况下,我们可以实时在控制台查看日志:但对于部署到服务器上的应用,日志都存放在服务器某个目录下,没法通过本地查看到 这种情况下,就需要我们先登录服务器,然后进入到日志目录文件夹,最后通过日志文件去定位问题:如果涉及到 K8s 容器,可能还需要使用 kubectl 命令进入到服务对应的容器中,进入到日志目录,才能开始定位问题,这一切显得非常繁琐且低效 本篇文章介绍一款 Python 依赖库:pexpect,作为一款

  • python使用paramiko实现远程拷贝文件的方法

    本文实例讲述了python使用paramiko实现远程拷贝文件的方法.分享给大家供大家参考,具体如下: 首先是安装paramiko库(其实现了SSH2安全协议),ubuntu下可直接通过源安装: sudo apt-get install python-paramiko 接下来是代码实现远程下载: def remote_scp(host_ip,remote_path,local_path,username,password): t = paramiko.Transport((host_ip,22)

  • python基于pyDes库实现des加密的方法

    本文实例讲述了python基于pyDes库实现des加密的方法.分享给大家供大家参考,具体如下: 下载及简介地址:https://twhiteman.netfirms.com/des.html 如需要在python中使用des加密,可以直接使用pyDes库加密,该库提供了CBC和ECB两种加密方式. 1.Windows下安装 下载后pyDes-x.x.x.zip并解压后,里面有setup.py文件,使用命令 setup.py --help可查看详细使用. 你可以使用命令python setup.

  • python3模拟实现xshell远程执行liunx命令的方法

    依赖包:pip install paramiko 源码demo: from time import * import paramiko # 定义一个类,表示一台远端linux主机 class Linux(object): # 通过IP, 用户名,密码,超时时间初始化一个远程Linux主机 def __init__(self, ip, username, password, timeout=30): self.ip = ip self.username = username self.passwo

  • Python基于OpenCV库Adaboost实现人脸识别功能详解

    本文实例讲述了Python基于OpenCV库Adaboost实现人脸识别功能.分享给大家供大家参考,具体如下: 以前用Matlab写神经网络的面部眼镜识别算法,研究算法逻辑,采集大量训练数据,迭代,计算各感知器的系数...相当之麻烦~而现在运用调用pythonOpenCV库Adaboost算法,无需知道算法逻辑,无需进行模型训练,人脸识别变得相当之简单了. 需要用到的库是opencv(open source computer vision),下载安装方式如下: 使用pip install num

  • python 基于selectors库实现文件上传与下载

    server.py import selectors import socket import os import time BASE_DIR =os.path.abspath(os.path.dirname(__file__)) class selectFtpserver: def __init__(self): self.dic = {} # 创建空字典 self.hasReceived = 0 self.hasSend=0 self.sel = selectors.DefaultSelec

随机推荐