Python Fabric 使用心得

Python Fabric 使用心得

这次CCTF决赛凑办过程中 吴博士叫我弄个脚本去部署10台虚拟机。Orz…… 在强压一下 我也只好去当一次运维了。。 记一下笔记。

  • 首先最重要的是怎么引用 sudo pip install fabric 安装后 测试一下成功安装没

croxy@Dell:~$ which fab
/usr/local/bin/fab

Ok了 来个栗子


from fabric.api import run

    def cmd():
    run('uname -s')

首先将这这个文件保存为fabfile.py(其他文件名也一样 但是使用方法略有不同) 运行


 fab -H 指定服务器 (-f 指定文件名) 函数名称:参数

 比如 fab -H localhost -f test.py cmd
 (如果保存文件名为fabfile.py就不需要f参数了)

  • Fabric API - Fabric包含了许多的模块 包括带颜色的输出类(color output),上下文管理类(context managers), 装饰器类(decorators), 网络类(network), 操作类(oprations), 任务类(tasks), 工具类(utils)。

颜色类包括(觉得并没有xxxxx)

----------------------


    fabric.colors.blue(text, bold=False)
    fabric.colors.cyan(text, bold=False)
    fabric.colors.green(text, bold=False)
    fabric.colors.magenta(text, bold=False)
    fabric.colors.red(text, bold=False)
    fabric.colors.white(text, bold=False)
    fabric.colors.yellow(text, bold=False)

上下文管理类


    with cd('/var'):
        run('ls')

等价于cd /var && ls

使用with还可以改变env的一些关键值


    with settings(user='root'):

这就可以吧当前env.user值改为root

还有很多API并不了解0.0。。。。 先Waiting

其实后面才是重点


   from fabric.api import *

   PATH_Ph = "/var/www/phpyou/hint"
   PATH_Dz = "/var/www/Discuz"
   PATH_Pw = "/home/pwn"


   env.user = 'cctf'
   env.password = 'heheda'
   env.hosts = ['172.23.26.130', '172.23.26.10','172.23.26.20','172.23.26.50','172.23.26.60','172.23.26.70','172.23.26.80','172.23.26.90','172.23.26.100','172.23.26.120']
   @task
   @parallel


def manage():
    #sudo("echo \<?php > "+ PATH_Ph +"/FLAG.php") 
    #sudo("cat " + PATH_Ph + "/fla*.php | grep CCTF >> "+ PATH_Ph +"/FLAG.php")
    #sudo("echo ?\> >> "+ PATH_Ph+"/FLAG.php")
    #sudo("cat " + PATH_Ph +"/FLAG.php")

    #sudo("rm "+ PATH_Ph +"/IP.dat")
    #sudo("wget http://172.xx.xx.91/IP.dat -O " + PATH_Ph + "/IP.dat")
    #sudo("rm "+ PATH_Ph +"/fla*.php")

    #sudo("rm "+ PATH_Dz +"/IP.dat")
    sudo("wget http://172.xx.27.218/cctf/read.txt -O " + PATH_Dz + "/upload.php")
    #sudo("cp /home/pwn/pwnfinal /var/www/Discuz/pwn")
    #sudo("chmod 777 /var/www/Discuz/pwn")

    #sudo("chattr -i " + PATH_Pw + "/IP.dat")
    #sudo("rm " + PATH_Pw + "/IP.dat")
    #sudo("wget http://172.31.34.91/IP.dat -O " + PATH_Pw + "/IP.dat")
    #sudo("chattr +i " + PATH_Pw + "/IP.dat")

一个小小的集群控制 运行 fab -f cctf.py manage 就能以sudo来执行了

一些炒鸡好用的tips!

from fabric.operations import *
  • 下载东西

     fabric.operations.get('/var/www/html/index.php', 'local_directory')
    

这样会下载远程的/var/www/html/index.php文件 到当前文件夹下 生成index.php

  • 上传东西

    fabric.operations.put('/home/croxy/1.txt', '/var/www/html/1.txt', use_sudo=True) 
    

这样会上传本地/home/croxy/1.txt到远程的/var/www/html/1.txt 而且会用sudo来完成这个过程

  • 断开所有链接
    > fabric.network.disconnect_all()

  • 重启机器(在等待的时间后自动链接)
    > fabric.operations.reboot(wait=120)

  • 不同机器执行不同命令

    env.roledefs={'pwn':['172.23.26.20'],'web':['172.23.26.10']}
    env.password='heheda'
    @roles('pwn')
    def task1():
        with cd('/home/pwn'):
            run('cat flag')
    @roles('web')
       def task2():
            sudo('cat flag')
       def deploy():
            execute(task1)
            execute(task2)
    
  • 弄一个交互式的Shell

        def cmd():
             open_shell("whoami")
        def shell():
            execute(cmd) 
    
comments powered by Disqus