pexpect 是 don libes 的 expect 語言的乙個 python 實現,是乙個用來啟動子程式,並使用正規表示式對程式輸出做出特定響應,以此實現與其自動互動的 python 模組。 pexpect 的使用範圍很廣,可以用來實現與 ssh、ftp 、telnet 等程式的自動互動;可以用來自動複製軟體安裝包並在不同機器自動安裝;還可以用來實現軟體測試中與命令列互動的自動化。
import pexpectimport sys
child = pexpect.spawn('ssh [email protected]')
child.logfile = sys.stdout
#fout = file('mylog.txt', 'w')
#child.logfile = fout
child.expect('password:')
child.sendline('std20')
child.expect('std20.*')
child.sendline('ls /')
child.expect('std20.*')
child.sendline('exit')
#coding=utf_8
from pexpect import pxssh
import sys
s = pxssh.pxssh()
s.logfile = sys.stdout
hostname = '123.57.211.212'
username = 'std20'
password = 'std20'
s.login(hostname, username, password)
s.sendline('ls /')
s.prompt() #匹配系統提示符
s.sendline('whoami')
s.prompt()
s.logout()
專案發布和運維的工作相當機械,頻率還蠻高,導致時間浪費在敲大量重複的命令上。
修復bug什麼的,測試,提交版本庫(2分鐘),ssh到測試環境pull部署(2分鐘),rsync到線上機器a,b,c,d,e(1分鐘),分別ssh到abcde五颱機器,逐一重啟(8-10分鐘) = 13-15分鐘
其中鬱悶的是,每次操作都是相同的,命令一樣,要命的是在多個機器上,很難在本機乙個指令碼搞定,主要時間都浪費在ssh,敲命令上了,寫成指令碼,完全可以一鍵執行,花兩分鐘看下執行結果。
安裝
pip install fabric
入門示例
#fabfile.pyfrom fabric.api import run
def host_type():
run('uname -s')
啟動
itcast@ubuntu:~/tmp/fab$ fab -h 127.0.0.1 host_type[127.0.0.1] executing task 'host_type'
[127.0.0.1] run: uname -s
[127.0.0.1] login password for 'itcast':
[127.0.0.1] out: linux
[127.0.0.1] out:
done.
disconnecting from 127.0.0.1... done.
itcast@ubuntu:~/tmp/fab$ fab -h 127.0.0.1 host_type
[127.0.0.1] executing task 'host_type'
[127.0.0.1] run: uname -s
[127.0.0.1] login password for 'itcast':
[127.0.0.1] out: linux
[127.0.0.1] out:
fabric常用引數
fabric常用api
fabric全域性屬性設定
示例1:動態獲取遠端目錄列表
from fabric.api import *env.hosts=['192.168.17.192', '192.168.17.193']
#env.password='python'
env.passwords =
@runs_once
def input_raw():
return prompt("please input directory name:", default="/home")
def workask(dirname):
run('ls -l ' + dirname)
@task
def go():
print('start ...')
getdirname = input_raw()
workask(getdirname)
print('end ...')
示例2:上傳檔案並執行
from fabric.api import *env.user = 'itcast'
env.hosts = ['192.168.17.192', '192.168.17.193']
env.password = 'python'
@task
@runs_once
def tar_task():
with lcd('/home/itcast/testdemo'):
local('tar zcvf demo.tar.gz demo.py')
@task
def put_task():
run('mkdir -p /home/itcast/testdemo')
with cd('/home/itcast/testdemo'):
put('/home/itcast/testdemo/demo.tar.gz', '/home/itcast/testdemo/demo.tar.gz')
@task
def check_task():
lmd5 = local('md5sum /home/itcast/testdemo/demo.tar.gz', capture=true).split(' ')[0]
rmd5 = run('md5sum /home/itcast/testdemo/demo.tar.gz').split(' ')[0]
if lmd5 == rmd5:
print('ok ...')
else:
print('error ...')
@task
def run_task():
with cd('/home/itcast/testdemo'):
run('tar zxvf demo.tar.gz')
run('python demo.py')
@task
def go():
tar_task()
put_task()
check_task()
run_task()
**自動化部署
from fabric.api import *env.user = 'itcast'
env.hosts = ['192.168.17.192', '192.168.17.193']
env.password = 'python'
@runs_once
@task
def local_update():
with lcd("/home/itcast/tmp/itcasthello"):
local("git add -a")
local("git commit -m 'update'")
local("git pull origin master")
local("git push origin master")
@task
def remote_update():
with cd("/home/itcast/tmp/itcasthello"):
run("git checkout master")
run("git pull origin master")
@task
def deploy():
local_update()
remote_update()
Linux上天之路(十四)之Linux資料處理
主要內容 常和管道協作的命令 grep grep 用於搜尋模式引數指定的內容,並將匹配的行輸出到螢幕或者重定向檔案中,常和管道協作的命令 grep。還有egrep和fgrep兩個命令。egrep可以使用擴充套件的正規表示式 fgrep沒有元字元與普通字元的區別 grep egrep用別名加了 col...
Linux上天之路(四)之Linux介面介紹
但是相對於伺服器來說,伺服器一般都是專業人員來進行維護的。linux提供了大量應用服務,且linux相對於windows來說免費且系統更加高效,所以被伺服器廣泛的應用,且因為文字介面使用記憶體較少,為了追求資源最大化,所以很多linux作業系統在安裝的時候只保留了文字介面。zhangyafei ce...
Linux上天之路(三)之Linux系統目錄
boot 存放啟動檔案 dev 存放裝置檔案 etc 存放配置檔案 home 普通使用者家目錄,以 home username的方式存放 media 移動儲存自動掛載目錄,以 media device name的方式來存放 mnt 手動掛載目錄 opt 三方軟體安裝目錄 proc 記憶體系統檔案 r...