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

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



2018年5月26日 19:03 阅读 375 评论 7

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

项目介绍

SSH 使用的库

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

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

脚本思路

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

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

源码解读

源码展示

# -*- 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,配置的信息格式遵循一般的配置文件的格式,如下:

[ssh]
host=119.23.106.34
port=22
username=user
password=password

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

读取配置信息的方式是函数 read_ini(),这个函数使用 Python 内置的库 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

SSH 连接执行

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

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

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 命令的操作了,我把这个执行 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()

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

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

cmd_get_path = ‘cd dbs;pwd‘

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

db_path = run_shell(cmd_get_path)

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

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

SFTP 下载文件

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

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

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() 方法:

sftp.get(from_file, to_file)

执行代码

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

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 然后返回文件的绝对地址:

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))

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

原创文章,转载请注明出处:http://www.tendcode.com/article/python-ssh/

原文地址:https://www.cnblogs.com/jiftle/p/9194763.html

时间: 2024-10-27 04:56:03

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

服务器上的文件的上传和下载

我们有很多种方式上传文件到服务器上,比如FTP, 比如使用命令行工具:SZ/RZ, SCP等等的. 我之前经常使用的是SZ/RZ这个命令,但是在Mac下经常乱码然后卡住不动了,所以我很崩溃.下面说说我现在 采用的办法吧. 下载文件 python -m SimpleHTTPServer 9999 上传文件 文件名:SimpleHTTPServerWithUpload.py #!/usr/bin/env python """Simple HTTP Server With Uplo

FTP服务器文件的上传,下载和获取

How to: Download Files with FTP This sample shows how to download a file from an FTP server. Example: using System; using System.IO; using System.Net; using System.Text; namespace Examples.System.Net { public class WebRequestGetExample { public stati

Python + Selenium + AutoIt 模拟键盘实现另存为、上传、下载操作详解

前言 在web页面中,可以使用selenium的定位方式来识别元素,从而来实现页面中的自动化,但对于页面中弹出的文件选择框,selenium就实现不了了,所以就需引用AutoIt工具来实现. AutoIt介绍 AutoIt简单介绍下,AutoIt 目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作.它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务.而这是其它语言不可能做到或无可靠方法实现的(例如VBSc

C# 之 FTP服务器中文件上传与下载(四)

        通过上一篇博客<C# 之 FTP服务器中文件上传与下载(三)>,我们已经实现将文件从我们创建的FTP服务器中下载到本地.今天就最后给大家讲解一下怎么对FTP中的文件进行重命名和删除操作. 首先在前台添加两个重命名和删除的按钮 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Defaul

在SecureCRT上,使用命令行从远程服务器上传或者下载文件

引言: 在服务器上,一般都会通过命令行来进行访问.对于上传或者下载文件的需求,除了使用filezilla之类的工具之外,还可以使用rz/sz来完成类似操作. 1.  SecureCRT SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件. 一般的运维或者开发人员都是使用这些工具来远程登录服务器,完成相应操作. 2.  上传或者下载文件需求 一般服务器如果开发了21端口,并支持ftp协议,则可以使用filezi

windows、linux通过ftp从ftp服务器上传和下载

最近需要用到文件的上传和下载,查看我们使用的系统,发现有一个进程为t_ftpd,怀疑其为一个ftp的守护进程,于是想要用ftp的方式实现. 在windows上使用bat脚本的方式实现: 首先写一个bat脚本: download.bat @echo off ftp -s:E:\Sylixos\SylixOS_Qt\build-TCWareWigget-Desktop_Qt_5_7_1_MinGW_32bit-Debug\debug\ftp\ftp.txt 这样就会调用ftp.txt文件 ftp.t

Http服务器实现文件上传与下载(四)

一.引言 欢迎大家来到和我一起编写Http服务器实现文件的上传和下载,现在我稍微回顾一下之前我说的,第一.二章说明说明了整体的HTTP走向,第三章实现底层的网络编程.接着这一章我想给大家讲的是请求获取,和响应发送的内容.这里主要讲解的响应内容,为什么?因为我们编写的是一个与浏览器交互的HTTP服务器,所以大多数的情况下我们只进行被动的应答. 这就是一种"提问--回答"的问题.其实在讲解这章的时候,我本来准备给大家讲解一下Linux一些信号中断的问题.因为在网络层发送的时候,系统会发送一

Http服务器实现文件上传与下载(五)

一.引言 欢迎大家和我一起编写Http服务器实现文件的上传和下载,现在我回顾一下在上一章节中提到的一些内容,之前我已经提到过文件的下载,在文件的下载中也提到了文件的续下载只需要在响应头中填写Content-Range这一字段,并且服务器的文件指针指向读取的指定位置开始读取传输.在这一章节中我讲讲解文件的上传这一功能,讲完这一章节,大致的功能也全部完成,接着就是上面文件控制模块和一些资源模块. 在文件的上传中主要以HttpRequest类为主,在考虑文件的上传时我一点迷惑,到底把文件的上传功能是放

python批量操作Linux服务器脚本,ssh密码登录(执行命令、上传、下载)(一)

1 #-*- coding: utf-8 -*- 2 #批量操作linux服务器(执行命令,上传,下载) 3 #!/usr/bin/python 4 import paramiko 5 import datetime 6 import os 7 import threading 8 def ssh2(ip,username,passwd,cmd): 9     try:10         paramiko.util.log_to_file('paramiko________.log')11