本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes

1 简介

  日常工作中经常需要通过SSH连接到多台远程服务器来完成各种任务,当需要操作的服务器众多,且要执行的任务涉及命令繁多时,如果可以以自动化的方式模拟SSH连接及执行命令的繁琐过程,对工作效率的提升是非常可观的。

  本文我就将带大家学习在Python中使用非常强大的fabric库来对常用的远程服务器连接管理操作进行自动化:

2 使用fabric玩转远程服务器管理

  fabric基于强大的paramikoinvoke等库,构建出一整套简单易用的API,使得我们使用简洁的语句就可以应付常见的各种远程服务器操作,使用pip install fabric完成安装,本文演示对应版本为2.6

2.1 连接到远程服务器并执行终端命令

  要建立并保持对远程服务器的连接,我们需要对fabric.Connection()进行实例化,其基础参数有:

  • host: str型,格式如'用户名@host:端口',其中':端口'部分可以省略,默认端口为22

  • connect_kwargs: dict型,用于传入其他连接所需参数,常用的有:

    • password: str型,当以密码方式连接时,用于传入与host参数对应的密码
    • pkey: str型,当以私钥方式连接时,用于设置对应密钥
    • timeout: float型,用于设置TCP连接的超时时长(单位:秒)

    其他可用参数你可以前往https://docs.paramiko.org/en/latest/api/client.html#paramiko.client.SSHClient.connectParameters了解更多

  • config: fabric.Config型,用于设置更多复杂功能参数,详见https://docs.fabfile.org/en/2.6/api/config.html

  先来看一个最基础的例子:

from fabric import Connection

# 建议将ssh连接所需参数变量化
user = '用户名'
host = 'host地址'
password = '密码' # 利用fabric.Connection快捷创建连接
c = Connection(host=f'{user}@{host}',
connect_kwargs=dict(
password=password
)) # 利用run方法直接执行传入的命令
c.run('pwd');

  可以看到,非常简单就完成了连接服务器及执行指定命令的过程,且run()方法所执行的命令打印出的结果,可以通过stdout属性进行保存:

# hide=True抑制run()过程对执行结果的自动打印
output = c.run('df -h', hide=True).stdout
print(output)

  获悉了fabric的基础使用后,接下来我们来学习一些进阶内容:

2.2 配置sudo命令密码自动预填入

  我们都知道,对于非root用户,在执行某些权限较高的命令时需要添加sudo前缀,并在会话的初次执行时需要手动输入当前用户的密码,而在fabric中,有两种方式可以实现这个步骤的自动化:

2.2.1 方式1:配合invoke.Responder

  我们可以配合invoke.Responder来实现当命令行返回密码输入提示时,自动输入并执行指定的命令:

from invoke import Responder

# 配置命令行内容监听规则
sudopass = Responder(
pattern=f'\[sudo\] password for {user}:',
response=password+'\n'
) # 注意需要设置pty=True
c.run('sudo pwd', pty=True, watchers=[sudopass]);

2.2.2 方式2:利用fabric.Config设置sudo密码

  除了上一种方式外,我们还可以使用fabric.Config在创建连接时就一次性提前配置好sudo密码,之后需要执行sudo命令时用sudo()方法代替run()方法即可:

from fabric import Config

# 预先配置sudo密码
config = Config(overrides={
'sudo': {
'password': password
}
}) c = Connection(host=f'{user}@{host}',
connect_kwargs={'password': password},
config=config) c.sudo('pwd');

2.3 远程文件传输

  很多朋友都知道可以使用pscpxshell之类的工具手动进行服务器与本地之间的文件相互传输,这些任务我们同样可以在fabric中自动化进行:

2.3.1 从本地上传文件到服务器

  使用put()方法可以将指定的本地文件上传至服务器的指定位置,remote参数对应服务器目标保存位置:

c = Connection(host=f'{user}@{host}',
connect_kwargs={'password': password}) # 创建示例文件
with open('file_transfer.txt', 'w') as d:
d.write('1') # 利用put方法上传至服务器
c.put('file_transfer.txt', remote='/home/feffery/') # 打印已上传文件内容
c.run('cat /home/feffery/file_transfer.txt');

2.3.2 从服务器下载指定文件到本地

  相反的,当我们需要从服务器取回指定文件到本地时,就可以使用get()方法:

c = Connection(host=f'{user}@{host}',
connect_kwargs={'password': password}) # 向文件末尾追加行
c.run('echo "\n2" >> file_transfer.txt') c.get('/home/feffery/file_transfer.txt') print(open('file_transfer.txt').read())


  以上就是本文的全部内容,欢迎在评论区与我进行讨论~

(数据科学学习手札132)Python+Fabric实现远程服务器连接的更多相关文章

  1. (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)

    一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...

  2. (数据科学学习手札47)基于Python的网络数据采集实战(2)

    一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...

  3. (数据科学学习手札32)Python中re模块的详细介绍

    一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...

  4. (数据科学学习手札80)用Python编写小工具下载OSM路网数据

    本文对应脚本已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们平时在数据可视化或空间数据分析的过程中经常会 ...

  5. (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图

    本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...

  6. (数据科学学习手札55)利用ggthemr来美化ggplot2图像

    一.简介 R中的ggplot2是一个非常强大灵活的数据可视化包,熟悉其绘图规则后便可以自由地生成各种可视化图像,但其默认的色彩和样式在很多时候难免有些过于朴素,本文将要介绍的ggthemr包专门针对原 ...

  7. (数据科学学习手札49)Scala中的模式匹配

    一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...

  8. (数据科学学习手札40)tensorflow实现LSTM时间序列预测

    一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...

  9. (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg

    *从本篇开始所有文章的数据和代码都已上传至我的github仓库:https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 pandas提供了很多方 ...

随机推荐

  1. 到底能不能用 join

    互联网上一直流传着各大公司的 MySQL 军规,其中关于 join 的描述,有些公司不推荐使用 join,而有些公司则规定有条件的使用 join, 它们都是教条式的规定,也没有详细说其中的原因,这就很 ...

  2. 绝世好题(DP)

    题目链接:绝世好题 暴力就不用说了,和lis神似,O(n2)妥妥的挂掉,但可以得大部分分(好像是90,80)... 考虑优化,来一发非正解的优化: #include<bits/stdc++.h& ...

  3. 面试官:熟悉JS中的new吗?能手写实现吗?

    目录 1 new 运算符简介 2 new 究竟干了什么事 3 模拟实现 new 运算符 4 补充 预备知识: 了解原型和原型链 了解this绑定 1 new 运算符简介 MDN文档:new 运算符创建 ...

  4. 『学了就忘』Linux基础命令 — 23、文件基本权限的介绍和作用

    目录 1.基本权限的介绍 (1)权限位的含义 (2)权限的优先级 2.权限的基本作用 (1)权限含义的解释 (2)目录权限说明 1.基本权限的介绍 (1)权限位的含义 前面讲解ls命令时,我们已经知道 ...

  5. Swift-技巧(四)设置照片尺寸和格式

    摘要 平时实现拍照功能时,都是网上一通搜索,整体复制粘贴,自称无脑实现.但是当要求照片是不同的尺寸和格式( JPEG)时,就费力搞照片.其实在设置拍照时,就可以直接设置照片的尺寸和格式,用直接的方法来 ...

  6. WPF进阶技巧和实战03-控件(4-基于范围的控件及日期控件)

    系列文章链接 WPF进阶技巧和实战01-小技巧 WPF进阶技巧和实战02-布局 WPF进阶技巧和实战03-控件(1-控件及内容控件) WPF进阶技巧和实战03-控件(2-特殊容器) WPF进阶技巧和实 ...

  7. laravel常用查询

    插入 DB::table('t_admin_users')->insert([ [ 'role_id' => $allData['roleId'], 'username' => $a ...

  8. 【Go语言学习笔记】hello world

    书接上回,上回说到了为什么要学习Go语言,今天我们来实际写一下,感受一下Go语言的精美之处. 环境搭建 安装和设置 Windows: Go安装包下载网址:https://golang.org/dl/ ...

  9. 『动善时』JMeter基础 — 57、Linux系统中运行JMeter脚本

    目录 1.Linux系统中安装Java环境 (1)解压Java安装包 (2)配置Java环境变量 (3)验证Java环境是否配置成功 2.Linux系统中安装JMeter (1)下载JMeter (2 ...

  10. centos7.2安装nginx

    1 安装相关编译环境 yum install gcc-c++ yum install pcre pcre-devel yum install zlib zlib-level yum openssl o ...