音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

python基于paramiko库远程执行 SSH 命令,实现 sftp 下载文件
日期:2021-09-08 13:43:54   来源:脚本之家

楔子

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

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    ASP编程JSP编程PHP编程.NET编程python编程