我本地和服务器的连接一直使用的是 Xshell 5,而在与服务器进行文件操作的时候使用的是 Xshell 推荐安装的一个工具 Xftp 5,然而,昨天自己想着从服务器下载备份好的的数据库文件到本地的时候发现这个文件传输工具居然过期不能用了,好气啊!于是没办法(机智如我)只好用 Python 来实现 SSH 的连接,顺便从服务器批量下载一些文件,实现自动化。
项目介绍
SSH 使用的库
首先需要介绍一个 Python 实现 SSH 连接的第三方库,名字叫做 paramiko
,经过一个短暂的熟悉,我发现这个库基本可以实现 SSH 连接中的一些常用方法,具体使用可以去看一些教程或者官方文档。
我还是比较喜欢从实际的应用出发来加深对一些新接触的第三方库的认知,所以有了这篇文章中涉及到的实际应用案例。
脚本思路
首先来介绍一下我这个简单的自动化脚本做的事情(由于想实现的事情比较单一且固定,所以直接写成了几个函数,写的比较随意):
- 首先创建一个配置文件,用来存放登录服务器的一些参数,例如服务器 host,端口 port,用户名称和密码等。
- 读取配置文件的信息,返回一个字典以备后续调用
- 使用 SSH 链接服务器,并且执行几个 shell 命令,返回需要下载的文件的绝对地址列表
- 连接 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(‘
‘)]
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