python实现SSH命令行: Fabric的使用
发布日期:2021-06-30 19:41:36
浏览次数:3
分类:技术文章
本文共 3690 字,大约阅读时间需要 12 分钟。
前言
Fabric是基于Python实现的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包括命令执行、文件上传、下载及完整执行日志输出等功能。Fabric在paramiko的基础上做了更高一层的封装,操作起来更加简单。
Fabric官网:
安装
pip install fabric
注: Fabric依赖第三方的setuptools、Crypto、paramiko包的支持
官网提供了一个简单的入门示例: /home/test/fabric/fabfile.py使用
命令格式如下
fab [options][:arg1, arg2=val2,host=foo,hosts='h1;h2',... ]...
fab命令引用默认文件名为fabfile.py
fabfile.py
-g,制定网关设备,比如堡垒机环境,填写堡垒机ip即可 -H,制定目标主机,多台主机用","号分隔 -P,以异步执行的方式执行多主机任务,默认为串行运行 -R,指定role(角色),以角色名区分不同业务组设备 -t,设置设备链接超时时间(秒) -T,远程运行主机命令执行超时时间(秒) -w,当命令行执行失败,发出警告,而非默认中止任务 例
fab -p Knfdkzo35(密码) -H 192.168.1.21,192.168.1.22 -- 'uname -s'
全局属性
env对象的作用是定义fabfile的全局设定,包括主机、用户、密码、角色等
env.host,定义目标主机,如env.hosts=[‘192.168.1.21’,‘192.168.1.22’] env.use,定义用户,如env.use="root"
env.port,定义目标主机端口,默认是22,如env.port="22"
env.password,定义密码,如env.password='gjakgoe4S'
env.passwords,与password功能一样,区别在于不同主机不同密码的应用场景 如 env.passwords = { 'root@192.168.1.21:22': 'HSk4j4o2L', 'root@192.168.1.21:23': 'Bsj3KsqG',}
env.gateway,定义网关IP,如env.gateway='192.168.1.23'
env.age,env.sex
env.roledefs,定义角色分组,如 env.roledefs = { 'webservers': ['192.168.1.21','192.168.1.22'], 'dbservers': ['192.168.1.25','192.168.1.26']}
通过@roles(‘xxxx’)修饰符的形式,角色修饰符下面的任务函数为其作用域
如@roles('webservers')dev webtask(): run('etc/init.d/nginx start') @roles('dbservers')dev dbtask(): run('etc/init.d/mysql start') @roles('webservers', 'dbservers')dev publictask(): run('uptime')dev deploy(): excute(webtask) excute(dbtask) excute(publictask)
在命令行执行fab deploy就可以实现不同角色执行不同的任务函数了
常用API
local,执行本地命令,如 local('uname -s')
lcd('/home')
cd,切换远程目录,如cd('/data/logs')
run,执行远程命令,如run('free -m')
sudo,以sudo方式执行远程命令 put,上传本地文件到远程主机,如put('/home/user.info','/data/user.info')
get,从远程主机下载文件到本地,如get('/data/user.info','/home/user.info')
prompt,获取用户输入信息,如prompt('please input user password')
confirm,获取提示信息确认,如confirm("Test failed. Continue[Y/N]?")
reboot,重启远程主机 @task,函数修饰符,标识的函数为fab可调用 @runs_once,函数修饰符。标识的函数只会执行一次,不受多台主机影响 示例
1 查看本地与远程主机信息
【home/test/fabric/simple1.py】#!/usr/bin/env pythonfrom fabric.api import *env.user = 'root'env.hosts = ['192.168.1.21','192.168.1.22']env.password = 'DnkIoH3k0'@runs_oncedef local_task(): local('uname -a')def remote_task(): with cd("/data/logs"): # "with"的作用是让后面的表达式的语句继承当前状态 run("ls -l")
执行
fab -f simple1.py local_task
fab -f simple1.py remote_task
2 动态获取远程目录列表
【home/test/fabric/simple2.py】#!/usr/bin/env pythonfrom fabric.api import *env.user = 'root'env.hosts = ['192.168.1.21','192.168.1.22']env.password = 'DnkIoH3k0'@runs_oncdef input_raw(): return prompt("please input directory name:", default="/home")def worktask(dirname): run("ls -l " + dirname)@task def go(): getdirname = input_raw() worktask(getdirname)
执行
fab -f simple2.py go
3 文件打包、上传与校验
【home/test/fabric/simple3.py】#!/usr/bin/env pythonfrom fabric.api import *from fabric.context_managers import *from fabric.contrib.console import confirmenv.user = 'root'env.hosts = ['192.168.1.21','192.168.1.22']env.password = 'DnkIoH3k0'@runs_oncedef tar_task(): with lcd("/data/logs"): local("tar -czf access.tar.gz access.log")def put_task(): run("mkdir -p /data/logs") with cd("/data/logs"): with settings(warn_only=True): result = put("/data/logs/access.tar.gz", "/data/logs/access.tar.gz") if result.failed and not confirm("put file failed, Continue[Y/N]?"): abort("Aborting file put task!")def check_task(): with settings(warn_only=True): lmd5=local("md5sum /data/logs/access.tar.gz", capture=True).split(' ')[0] rmd5=run("md5sum /data/logs/access.tar.gz").split(' ')[0] if lmd5 == rmd5: print("OK") else: print("ERROR")@taskdef go(): tar_task() put_task() check_task()
执行
fab -f simple3.py go
转载地址:https://linxinfa.blog.csdn.net/article/details/89787696 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年05月02日 02时48分37秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
tf keras Dense源码解析
2019-04-30
tf rnn输入输出的维度和权重的维度
2019-04-30
检验是否服从同一分布
2019-04-30
tf callbacks
2019-04-30
keras、tf、numpy实现logloss对比
2019-04-30
Ubuntu20.04安装微信
2019-04-30
Restful风格的使用
2019-04-30
Swagger基础入门整合SpringBoot
2019-04-30
MyBatisPlus简单入门(SpringBoot)
2019-04-30
攻防世界web进阶区NewsCenter详解
2019-04-30
攻防世界web进阶PHP2详解
2019-04-30
如何解决词达人问题(新)
2019-04-30
攻防世界web进阶区surpersqli详解
2019-04-30
攻防世界web进阶区easytornado详解
2019-04-30
攻防世界web进阶区web2详解
2019-04-30
xss-labs详解(上)1-10
2019-04-30
xss-labs详解(下)11-20
2019-04-30
攻防世界web进阶区ics-05详解
2019-04-30
攻防世界web进阶区FlatScience详解
2019-04-30
攻防世界web进阶区ics-04详解
2019-04-30