Python 远程连接服务器用它就够了
作者 | 费弗里
来源 | Python大数据分析
❝本文示例代码及文件已上传至我的
❞Github
仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
日常工作中经常需要通过SSH
连接到多台远程服务器来完成各种任务,当需要操作的服务器众多,且要执行的任务涉及命令繁多时,如果可以以自动化的方式模拟SSH
连接及执行命令的繁琐过程,对工作效率的提升是非常可观的。
本文我就将带大家学习在Python
中使用非常强大的fabric
库来对常用的远程服务器连接管理操作进行自动化😋:

2 使用fabric玩转远程服务器管理
fabric
基于强大的paramiko
、invoke
等库,构建出一整套简单易用的API
,使得我们使用简洁的语句就可以应付常见的各种远程服务器操作,使用pip install fabric
完成安装,本文演示对应版本为2.6
。
2.1 连接到远程服务器并执行终端命令
要建立并保持对远程服务器的连接,我们需要对fabric.Connection()
进行实例化,其基础参数有:
「host:」 str型,格式如
'用户名@host:端口'
,其中':端口'
部分可以省略,默认端口为22「connect_kwargs:」 dict型,用于传入其他连接所需参数,常用的有:
其他可用参数你可以前往
https://docs.paramiko.org/en/latest/api/client.html#paramiko.client.SSHClient.connect
的Parameters
了解更多「password:」 str型,当以密码方式连接时,用于传入与
host
参数对应的密码「pkey:」 str型,当以私钥方式连接时,用于设置对应密钥
「timeout:」 float型,用于设置
TCP
连接的超时时长(单位:秒)
「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 远程文件传输
很多朋友都知道可以使用pscp
、xshell
之类的工具手动进行服务器与本地之间的文件相互传输,这些任务我们同样可以在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())

以上就是本文的全部内容,欢迎在评论区与我进行讨论~
往
期
回
顾
资讯
人工智能在数学领域实现新发现和新见解
资讯
AI监视打工人,这个国家明确保护摸鱼
资讯
全球首个活体机器人,能生娃
技术
Python实现人脸监测制作摸鱼神器
分享
点收藏
点点赞
点在看
相关文章:

如何在centos安装python-mysql
在python中使用mysql,需要安装mysql-python依赖包,可以通过pip来安装:pip install MySQL-python如果发生错误,需要先安装一个开发包:yum install python-devel如果还是报错,运行:yum install my…

DNS 到底怎么工作的? (How does dns work?)
其实这个问题每次看的时候都觉得很明白,但是很久之后就忘记了,所以这次准备记录下来。深入到这个过程的各个细节之中,以后多看看。 Step 1 请求缓存信息: 当你在开始访问一个 www.baidu.com 开始,第一件事情就是去访问…

#pragma pack(n) 的作用
在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结…

LoadRunner设置检查点的几种方法介绍
LoadRunner设置检查点的几种方法介绍 发布时间: 2011-5-03 11:53 作者: 一米阳光做测试 来源: 51Testing软件测试网采编 字体: 小 中 大 | 上一篇 下一篇 | 打印 | 我要投稿 3、将脚本切换回代码界面, 在光标闪烁的上行,添加如下的代码&…

Python 爬虫利器 Selenium 从入门到进阶
作者 | 俊欣来源 | 关于数据分析与可视化今天小编就来讲讲selenium,我们大致会讲这些内容selenium简介与安装页面元素的定位浏览器的控制鼠标的控制键盘的控制设置元素的等待获取cookies调用JavaScriptselenium进阶selenium的简介与安装selenium是最广泛使用的开源W…

获取下个月的今天
/* 获取下个月的今天如果 $date 2018-1-31 二月没有31号 则获取二月份的最后一天 返回值为2018-2-28如果 $date 2018-1-15 返回值为2018-2-15 -- psw-- */function getNextMonthDays($date){$firstday date(Y-m-01, strtotime($date));$lastday strtotime("$firstday …

C语言的sizeof和strlen
strlen是函数,而sizeof是算符。strlen需要进行一次函数调用,而对于sizeof而言,因为缓冲区已经用已知字符串进行了初始化,起长度是固定的,所以sizeof在编译时计算缓冲区的长度。因为sizeof()测试的是数组的长度。而strl…

机器人 Ameca「苏醒」瞬间逼真到令人恐惧,网友纷纷惊叹……
整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 近日,国内外网友都被一段机器人「苏醒」的视频惊讶到。 视频开始时,机器人似乎已经睡着,眼睛闭着,头部略微向下倾斜。随着肩膀的伸展,机器…

linux源码包卸载方式
linux源码包软件的安装与卸载3人收藏此文章,我要收藏 发表于1年前 , 已有593次阅读 共0个评论Linux软件安装与卸载(源码包形式):一般情况下linux程序的发布不能像windows那样,直接打包成一个setup.exe文件,然用户安装 …
在实践中我遇到stompjs, websocket和nginx的问题与总结
阅读原文:https://wdd.js.org/stomp-over... 1. AWS EC2 不支持WebSocket 直达解决方案 英文版 简单说一下思路:WebSocket底层基于TCP协议的,如果你的服务器基于HTTP协议暴露80端口,那WebSocket肯定无法连接。你只要将HTTP协议修改…

C语言memset函数详解(Linux下和windows下的差异)
memest原型 (please type "man memset" in your shell) void *memset(void *s, int c, size_t n); memset:作用是在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法。 #include <stdio.h>#include <string.…

Oracle 工程师离职并回踩:MySQL 糟糕透顶,强烈推荐 PostgreSQL
整理 | 祝涛 出品 | CSDN(ID:CSDNnews)如果你即将离职,你会做什么?抨击自己付出了五年心血的技术——这是Oracle公司前首席软件工程师、MySQL优化器团队成员Steinar Gunderson的选择。这位工程师现已在Chrome团队…

ORA-01109:数据库未打开(解决)
SQL> startup mountORA-01081: 无法启动已在运行的 ORACLE - 请首先关闭它SQL> shutdown immediateORA-01109: 数据库未打开 已经卸载数据库。ORACLE 例程已经关闭。SQL> startup mountORACLE 例程已经启动。 Total System Global Area 612368384 bytesFixed Size 125…

[洛谷P1317]低洼地
题目大意:一组数,分别表示地平线的高度变化。高度值为整数,相邻高度用直线连接。找出并统计有多少个可能积水的低洼地?(首尾都为0) 题解:求出其中都多少个不严格下降子段和不严格上升子段所夹的…

Linux环境编程--多线程
本文作者: 姚继锋 (2001-08-11 09:05:00) 时隔多年 原文地址已经无从查。。。 居然是2001年就写了 今天看来对初学者还是很有参考意义 所以特转给大家 本人在原文基础上适当修改 1 引言 线程(thread)技术早在60年代就被提出,但真正应…

Python 到底该怎么学才好?你关心的答案来了
相对于Android、IOS等技术,Python有着更为广阔的应用领域,例如前后端、AI、数据分析、爬虫、自动化、游戏开发等几乎所有领域都有它的应用。但也正因为如此,很多新人在学完Python基础后,根本不知道该选择什么方向深造,…

9513 防空洞
时间限制:1000MS 内存限制:65535K提交次数:104 通过次数:24 题型: 编程题 语言: G;GCC Description 有一天,dragon123偷偷地拿锄头在学校里挖开了一个尘封已久的防空洞。他在这个防空洞里面找到许多贵重的东西:一些石头和一些液体。dragon123知道&…

学习Mybatis与mysql数据库的示例笔记
目录结构: pom.xml文件 1 <?xml version"1.0" encoding"UTF-8"?>2 <project xmlns"http://maven.apache.org/POM/4.0.0"3 xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"4 xsi:schem…

Linux环境编程--进程通信
实验内容 编写程序实现进程的管道通信。用系统调用pipe( )建立一管道,二个子进程P1和P2分别向管道各写一句话:Child 1 is sending a message!Child 2 is sending a message! 父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1&…

你的编程能力从什么时候开始突飞猛进的?
如果提到程序员,很多人的印象是:呆板、木讷、不懂浪漫。如果提到代码,很多人的印象是:枯燥、繁琐、很难理解。但其实程序员的浪漫是普通人想象不到的,有一个网友为了追女生,以自己和女生为主角写了一个战棋…

超级 App 手机百度云端架构设计与个性化推荐
2015 年 6 月 28 日下午,百度与 InfoQ 携手举办了手机百度“云和端技术实践”沙龙活动。这是手机百度首次公开超级 App 背后的技术知识。活动分云端和客户端技术两个会场同时举办,吸引了众多技术爱好者前来学习交流。现场人数爆满,气氛热烈。…
Scala和范畴论 -- 对Monad的一点认识
背景 所有一切的开始都是因为这句话:一个单子(Monad)说白了不过就是自函子范畴上的一个幺半群而已,有什么难以理解的。第一次看到这句话是在这篇文章:程序语言简史(伪)。这句话出自Haskell大神Philip Wadler࿰…

Linux环境编程--linux中的perror、exit、_exit、wait 和 waitpid
perror:#include<stdio.h> #include<stdlib.h>定义函数 void perror(const char *s); perror ("open_port");函数说明 perror ( )用 来 将 上 一 个 函 数 发 生 错 误 的 原 因 输 出 到标 准 错误 (stderr) 。参数 s 所指的字符…

DeepMind 打造 AI 游戏系统,可以玩扑克、国际象棋、围棋等,战斗力爆表
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 谷歌母公司 Alphabet 的人工智能实验室 DeepMind 长期以来一直投资于游戏人工智能系统。实验室的理念是,游戏虽然缺乏明显的商业应用,但却是认知和推理能力的独特相关挑战。这使…

WPF-动态加载
添加一个UserControl,命名为BusyIndicator,view为空,在其.cs文件中定义一个类 1 /// <summary> 2 /// 动态实体 3 /// </summary> 4 public class AnimationObject 5 { 6 publ…

ORA-06502 when awr report produce
最近在生成一套系统的AWR报告时出现了如下报错:ORA-06502: PL/SQL: numeric or value error: character string buffer too small,然后生成AWR报告的过程就终止了,查看生成的AWR报告,发现报告时不完整的,AWR报告到Comp…

进程间通信学习小结(共享内存)
要使用共享内存,应该有如下步骤:1.开辟一块共享内存 shmget()2.允许本进程使用共某块共享内存 shmat()3.写入/读出4.禁止本进程使用这块共享内存 shmdt()5.删除这块共享内存 shmctl()或者命令行下ipcrm 共享内存可以说是最有用的进程间通信方式ÿ…

[ObjectiveC]NSDATA, NSDICTIONARY, NSSTRING互转
2019独角兽企业重金招聘Python工程师标准>>> NSDATA-->NSDICTIONARY NSDictionary *dict [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; NSDICTIONARY-->NSDATA NSData *data [NSJSONSerialization dat…

如流智会2021:技术结合场景 让企业知识懂员工
12月10日,“如流智会2021智能进化”在京举行,学界专家业界大咖云集荟聚,共商企业智能化转型之道。会上,百度集团副总裁、百度集团首席信息官(CIO)李莹表示:“智能经济时代,智能组织是…

WSFC 仲裁模型选择
今天我们再来详细讨论下关于WSFC的仲裁模型,主要仲裁模型的优缺点,应该如何去思考选择最佳合适方案WSFC引入仲裁,主要有两个目的跟踪群集当前运作票数是否符合仲裁模型协定,如果低于最少允许节点,则决定关闭群集&#…