Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载

Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载

作者头像
Hopetree
发布于 2022-09-26 09:33:44
发布于 2022-09-26 09:33:44
1.5K00
代码可运行
举报
文章被收录于专栏:tendcodetendcode
运行总次数:0
代码可运行

我本地和服务器的连接一直使用的是 Xshell 5,而在与服务器进行文件操作的时候使用的是 Xshell 推荐安装的一个工具 Xftp 5,然而,昨天自己想着从服务器下载备份好的的数据库文件到本地的时候发现这个文件传输工具居然过期不能用了,好气啊!于是没办法(机智如我)只好用 Python 来实现 SSH 的连接,顺便从服务器批量下载一些文件,实现自动化。

项目介绍

SSH 使用的库

首先需要介绍一个 Python 实现 SSH 连接的第三方库,名字叫做 paramiko,经过一个短暂的熟悉,我发现这个库基本可以实现 SSH 连接中的一些常用方法,具体使用可以去看一些教程或者官方文档。

我还是比较喜欢从实际的应用出发来加深对一些新接触的第三方库的认知,所以有了这篇文章中涉及到的实际应用案例。

脚本思路

首先来介绍一下我这个简单的自动化脚本做的事情(由于想实现的事情比较单一且固定,所以直接写成了几个函数,写的比较随意):

  1. 首先创建一个配置文件,用来存放登录服务器的一些参数,例如服务器 host,端口 port,用户名称和密码等。
  2. 读取配置文件的信息,返回一个字典以备后续调用
  3. 使用 SSH 链接服务器,并且执行几个 shell 命令,返回需要下载的文件的绝对地址列表
  4. 连接 SFTP 批量下载文件到本地

源码解读

源码展示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
import paramiko
import os
from configparser import ConfigParser


# 读取配置文件获取服务器的登录信息
def read_ini():
    info = dict()
    cf = ConfigParser()
    cf.read('config.ini', encoding='utf-8')
    keys = cf.options('ssh')
    for each in keys:
        info[each] = cf.get('ssh', each)
    print(info)
    return info


# 连接服务区并执行shell命令返回输出结果
def ssh_test(host, port, username, password):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接服务器
    try:
        ssh.connect(hostname=host, port=port, username=username, password=password)
    except Exception as e:
        print(e)
        return

    # 设置一个内部函数,执行shell命令并返回输出结果
    def run_shell(cmd):
        ssh_in, ssh_out, ssh_error = ssh.exec_command(cmd)
        result = ssh_out.read() or ssh_error.read()
        return result.decode().strip()

    # 获取指定文件夹的绝对地址
    cmd_get_path = 'cd dbs;pwd'
    db_path = run_shell(cmd_get_path)

    # 获取指定文件夹中文件的名称,并跟上面得到的文件夹绝对地址组合起来
    cmd_get_sqls = 'cd dbs;ls'
    sqls = run_shell(cmd_get_sqls)
    lis = ['{}/{}'.format(db_path, each) for each in sqls.split('\n')]
    print(lis)

    # 关闭连接
    ssh.close()
    return lis


# 链接服务器进行文件传输
def sftp_test(host, port, username, password, from_file, to_file):
    transport = paramiko.Transport((host, port))
    try:
        transport.connect(username=username, password=password)
    except Exception as e:
        print(e)
        return
    sftp = paramiko.SFTPClient.from_transport(transport)

    # 将文件下载到本地,如果是上传使用 put
    sftp.get(from_file, to_file)
    transport.close()


if __name__ == '__main__':
    info = read_ini()
    h = info.get('host', None)
    p = int(info.get('port', None)) # 端口是int类型
    u = info.get('username', None)
    pw = info.get('password', None)
    files = ssh_test(h, p, u, pw)

    path = 'F:\\dbs'
    if files:
        for each in files:
            name = each.split('/')[-1]
            ss = sftp_test(h, p, u, pw, each, os.path.join(path, name))

配置文件读取

首先,配置文件是放在跟脚本同目录下的,文件名称为 config.ini,配置的信息格式遵循一般的配置文件的格式,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[ssh]
host=119.23.106.34
port=22
username=user
password=password

只需要提供以上四个信息就可以连接到服务器。

读取配置信息的方式是函数 read_ini(),这个函数使用 Python 内置的库 configparser 去读取配置文件,并且返回一个键值对的字典,以供后续的函数调用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def read_ini():
    info = dict()
    cf = ConfigParser()
    cf.read('config.ini', encoding='utf-8')
    keys = cf.options('ssh')
    for each in keys:
        info[each] = cf.get('ssh', each)
    print(info)
    return info

SSH 连接执行

ssh_test 函数是用来连接 SSH 的方法,这个方法接受4个参数,也就是上面的配置文件需要提供的参数。

首先需要创建一个 ssh 连接的实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

然后传入相关参数,尝试连接到远程服务器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try:
    ssh.connect(hostname=host, port=port, username=username, password=password)
except Exception as e:
    print(e)
    return

当服务器已经连接成功之后,可以进行 shell 命令的操作了,我把这个执行 shell 命令的操作过程写到一个内嵌的函数中,这样可以方便执行不同的命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def run_shell(cmd):
    ssh_in, ssh_out, ssh_error = ssh.exec_command(cmd)
    result = ssh_out.read() or ssh_error.read()
    return result.decode().strip()

ssh.exec_command(cmd) 会得到三个对象,其中第二个就是命令执行成功的结果,第三个是命令执行失败的结果,所以我们可以取第二个的结果作为命令执行成功返回的结果,结果需要转码,并且要去掉末尾的换行符。

这里我首先执行了一条 shell 命令,多个命令直接需要使用分号隔开,这个命令是返回当前文件夹的绝对地址:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cmd_get_path = 'cd dbs;pwd'

命令执行的结果放到一个变量中保存,后续需要调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db_path = run_shell(cmd_get_path)

然后第二条 shell 命令是返回指定文件夹下的所有文件,我这里是返回的自己的服务器上面数据库备份的文件,通过看代码就能看到我这里处理了一下文件名称,让它们变成了绝对地址,这样方便后续下载文件。

最后这个函数返回的就是一个服务器上面的文件夹中包含的所有文件的绝对地址组成的列表。

SFTP 下载文件

下载文件的操作写在函数 sftp_test() 中,这个函数除了要传递登录服务器的4个基本参数外,还要传递2个参数,第一个是服务器上面的文件的绝对地址,第二个是本地保存的文件的地址(相对地址和绝对地址都行)。

看代码,这里和连接 SSH 有一些区别,不过大体的思路一样,都是先创建实例,然后尝试连接:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
transport = paramiko.Transport((host, port))
try:
    transport.connect(username=username, password=password)
except Exception as e:
    print(e)
    return
sftp = paramiko.SFTPClient.from_transport(transport)

连接之后,就可以使用 get() 方法来下载文件了,如果要上传的话,可以使用与之对应的 put() 方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sftp.get(from_file, to_file)

执行代码

最后执行代码的过程其实就是之前讲到的项目思路,首先运行配置文件读取的函数,读取配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
info = read_ini()
h = info.get('host', None)
p = int(info.get('port', None)) # 端口是int类型
u = info.get('username', None)
pw = info.get('password', None)

这里需要注意,由于端口接受的是一个 int 类型,而在配置中是字符串,所有需要转换一下才能使用,不然就会报错。

读取了配置就可以连接 SSH 然后返回文件的绝对地址:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
files = ssh_test(h, p, u, pw)

最后使用循环来分别下载每个文件到本地保存即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
path = 'F:\\dbs'
if files:
    for each in files:
        name = each.split('/')[-1]
        ss = sftp_test(h, p, u, pw, each, os.path.join(path, name))

总结:使用 Python 连接服务器进行操作在运维自动化中应该使用会比较多,这篇文章主要是通过一个实例来介绍一下 Python 连接 SSH 之后的基本操作,还有更多的操作有待读者自己去学习和实战。

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处 本文链接:https://cloud.tencent.com/developer/article/2123451 许可协议:署名-非商业性使用 4.0 国际许可协议

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年5月26日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python学习—paramiko模块实
paramiko模块提供了ssh及sft进行远程登录服务器执行命令和上传下载文件的功能。这是一个第三方的软件包,使用之前需要安装。
py3study
2020/01/08
3880
Python:指定 SSH-ED25519 公钥算法访问 OpenSSH-server
随着 OpenSSH 的不断更新和安全性的提升,最新版本的 OpenSSH 服务器(如 openssh-server-9.8p1-1)逐步减少了对某些旧公钥算法的支持,转而仅支持更安全的算法如 ssh-ed25519。这在增强安全性的同时,也给一些依赖旧公钥算法的工具和脚本带来了兼容性问题。本文将探讨如何解决 Python 脚本在这种环境下无法正常连接服务器的问题。
运维开发王义杰
2024/07/20
1870
Python:指定 SSH-ED25519 公钥算法访问 OpenSSH-server
利用Python Paramiko开发
    前面利用Python中的Paramiko模块可以进行SSH的连接,以及用来传送文件(SFTP),但是无论是哪一种方式,连接都是短暂的,并非是长连的,即一次执行一个命令或上传与下载一个文件,显然效率是不如直接使用Linux shell下的ssh连接命令来进行连接。其实在将Paramiko的源码解压出来后,里面有一个demo的文件夹,里面有一个demo.py的程序,利用它,我们就可以进行长连接,即像ssh一样连接远程主机:
py3study
2020/01/06
1.1K0
利用Python Paramiko开发
Python ssh 上传文件
一、安装 安装python 链接: python3详细安装教程 安装paramiko(模块) pip install paramiko 二、代码 V1.0 #V1 2022-9-11 20:51 #CY import paramiko import os hostname = '服务端地址' username = '服务端用户名' password = '服务端密码' tran = paramiko.Transport(hostname,22) #连接SSH服务端 tran.connect(user
超级小的大杯柠檬水
2023/05/06
5330
Python 常用内置模块详解
OS模块提供了多数操作系统的功能接口函数,当OS模块被导入后,它会自适应于不同的操作系统平台,根据不同的平台进行相应的操作,在Python编程时,经常和文件、目录打交道,所以离不了OS模块,OS模块也是在开发中最常用到的模块之一,本节内容将对OS模块提供的函数进行详细的解读,先来看一下OS模块的常用参数吧.
王瑞MVP
2022/12/28
1.3K0
Python 学习笔记 – Paramiko 模块
Python提供了一个Paramiko模块,允许我们通过SSH 对远程系统进行操作,上传和下载文件。他的使用很直观,下面直接看例子。
全栈程序员站长
2022/07/19
2420
Python实现ssh远程执行
paramiko是基于Python实现的SSH2远程安全连接,支持认证及密钥方式。可以实现远程命令执行、文件传输、中间SSH代理等功能,相对于Pexpect,封装的层次更高,更贴近SSH协议的功能
summerking
2022/09/19
2.1K0
Python实现ssh远程执行
python的paramiko模块
  paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。
py3study
2020/01/09
5660
Python33 paramiko模块
需要打开cmd,通过 pip install paramiko 命令来安装paramiko模块。
py3study
2020/01/07
9880
Python: 一周笔记
微信截图_20170806152336.png 主要介绍几个用到的python模块的使用方法。 python 含有丰富的内置和第三方库,企图全部掌握并精通那是不可能的。 但当你开发任务需要到的时候,你可以及时的避免重复的一些操作。 同时你可以从你使用的这些库中学习: 项目的文档结构 项目的代码风格 组织结构 代码扩展能力 API的设计 ...... 1. os 主要是完成的是对文件、文件目录等的操作。 2. sys 主要完成的是对系统参数,输入输出的操作。 3. subprocess 主要完成的是执行sh
谢伟
2018/06/06
6110
paramiko模块——ssh远程连接服务器并执行命令
https://www.cnblogs.com/ghylpb/p/12158061.html
GH
2020/03/19
3.2K0
Python Paramiko实现sftp文件上传下载以及远程执行命令
Paramiko模块是基于Python实现的SSH远程安全连接,用于SSH远程执行命令、文件传输等功能。
py3study
2020/02/29
10.1K0
用Python远程登陆服务器的最佳实践
在使用 Python 写一些脚本的时候,在某些情况下,我们需要频繁登陆远程服务去执行一次命令,并返回一些结果。
AI科技大本营
2020/03/03
2.9K0
Python使用Paramiko实现SSH管理
paramiko 是一个用于在Python中实现SSHv2协议的库,它支持对远程服务器进行加密的通信。目前该模块支持所有平台架构且自身遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接,你可以在Python中实现SSH客户端和服务器,并进行安全的文件传输和远程命令执行。
王瑞MVP
2023/11/24
3660
python paramiko模块简介
    paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。
py3study
2020/01/09
1.1K0
python3 paramiko 基于RSA私钥远程执行ssh、上传、下载文件
paramiko 遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接,可以实现远程文件的上传,下载或通过ssh远程执行命令。
Devops海洋的渔夫
2019/09/25
1.2K0
Python建立ssh连接|paramiko实践
之前写了一篇Python调用系统命令的六种方法,但是执行linux命令时,需要在本地运行,如果想远程执行命令,就要用到另一个库paramiko。
吾非同
2020/12/17
2.7K0
python paramiko模块
    paramiko模块是python中很重要的模块,他的功能呢主要分为两大块功能。一个是模拟SSH功能登录到远程主机上执行命令。一个是模拟SFTP功能传输文件。
py3study
2020/01/06
8770
python3 paramiko 远程执行 ssh 命令、上传文件、下载文件
在win10的系统下,本来想要python3直接调用ansible库进行远程执行的,但是很可惜,ansible是基于linux系统的ssh服务进行远程调用,不太兼容windows。 那么下面来使用paramiko库,直接手写一个ssh远程调用。
Devops海洋的渔夫
2019/06/15
5.9K0
相关推荐
Python学习—paramiko模块实
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文