Pexpect是Don Libes的Expect语言的一个Python实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的Python模块
Pexpect的使用范围很广,可以用来实现与ssh、ftp、telnet等程序的自动交互,可以用来自动复制软件安装包并在不同机器自动安装,还可以用来实现软件测试中与命令行交互的自动化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
from pexpect import pxssh import getpass
s = pxssh.pxssh()
hostname = input('hostname: ')
username = input('username: ')
password = getpass.getpass('password: ')
s.login(hostname, username, password, original_prompt='[$#>]')
s.sendline('uptime')
s.prompt()
print(s.before)
s.sendline('ls -l')
s.prompt()
s.logout()
|
运行结果
1 2 3 4 5 6 7
| hostname: 115.28.240.96 115.28.240.96 username: root root password: 88aa66AA
b'uptime\r\n 13:05:13 up 30 days, 20:04, 2 users, load average: 0.00, 0.01, 0.05\r\n'
|
Fabric目前只支持Python2.x
Fabric是一个Python(2.5-2.7)库,用于简化使用SSH的应用程序部署或系统管理任务。
它提供的操作包括:执行本地或远程shell命令,上传/下载文件,以及其他辅助功能,如提示用户输入、中止执行等
Fabric常用参数
- -l:显示定义好的任务函数名
- -f:指定fab入口文件,默认入口文件名为fabfile.py
- -H:指定目标主机,多台主机用”,”号分割
Fabric常用API
- local:执行本地命令,如:local(‘uname -s’)
- lcd:切换本地目录,如:lcd(‘/home’)
- cd:切换远程目录,如:cd(‘/etc’)
- run:执行远程命令,如:run(‘free -m’)
- sudo:sudo方式执行远程命令,如:sudo(‘touch/abc’)
- put:上传本地文件到远程主机,如:put(‘/hello’,’/home/hello’)
- get:从远程主机下载文件到本地,如:get(‘/home/python/world’,’/home/matrix/world’)
- reboot:重启远程主机,如:reboot()
- @task:函数装饰器,标识的函数为fab可调用,非标记的对fab不可见,纯业务逻辑
- @runs_once:函数装饰器,标识的函数只会执行一次,不受多台主机影响
Fabric全局属性设定
- env.host:定义目标主机,如:env.host=[‘192.168.3.243’,’192.168.3.244’]
- env.user:定义用户名,如:env.user=”root”
- env.port:定义目标主机端口,默认为22,如:env.port=”22”
- env.password:定义密码,如:env.password=”lmb2015”
- env.passwords:不同的主机不同的密码,如:env.passwords={'root@192.168.3.243:22’:’lmb2015’,'root@192.168.3.244:22’:’lmb2015’}
安装ANACONDA
1
| bash Anaconda2-4.4.0-Linux-x86_64.sh
|
安装Fabric
执行本地shell命令
1 2 3 4 5 6 7
|
from fabric.api import local
def hello(): local('ls -l /home/')
|
hello()函数就是一个任务
执行
1 2 3 4 5 6 7
| [root@VM-2-2 test] [localhost] local: ls -l /home/ 总用量 8 drwx------. 8 hadoop hadoop 4096 4月 14 17:17 hadoop drwx------ 3 hanlp hanlp 4096 5月 8 11:13 hanlp
Done.
|
任务带参数
1 2 3 4 5
| [root@VM-2-2 test]
def hello(name, value): print "Hello Fabric!%s=%s" % (name, value)
|
执行
1 2 3 4
| [root@VM-2-2 test] Hello Fabric!matrix=sparse
Done.
|
执行远程命令
1 2 3 4 5 6 7 8 9 10 11 12
| [root@VM-2-2 test]
from fabric.api import run, env
env.hosts = ['115.28.240.96'] env.user = 'root' env.password = 'xxxxxx'
def hello(): run('ls -l /home')
|
执行
1 2 3 4 5 6 7 8 9 10
| [root@VM-2-2 test] [115.28.240.96] Executing task 'hello' [115.28.240.96] run: ls -l /home [115.28.240.96] out: total 4 [115.28.240.96] out: drwx------. 8 matrix matrix 4096 Jul 28 17:59 matrix [115.28.240.96] out:
Done. Disconnecting from 115.28.240.96... done.
|
动态获取远程目录列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
from fabric.api import *
env.hosts = ['192.168.3.243', '192.168.3.244'] env.user = 'root' env.password = 'lmb2015'
@runs_once def input_raw(): return prompt("please input name:", default="/home")
def workask(dirname): run('ls -l ' + dirname)
@task def go(): print "start ..." getdirname = raw_input() workask(getdirname) print "end ..."
|
执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| [root@VM-2-2 test] [192.168.3.243] Executing task 'go' start ... /root [192.168.3.243] run: ls -l /root [192.168.3.243] out: 总用量 300588 [192.168.3.243] out: -rw-------. 1 root root 1067 4月 28 2015 anaconda-ks.cfg [192.168.3.243] out: -rw-r--r--. 1 root root 601 2月 22 10:53 id_dsa.pub [192.168.3.243] out: -rw-r--r--. 1 root root 13231 4月 28 2015 install.log [192.168.3.243] out: -rw-r--r--. 1 root root 3482 4月 28 2015 install.log.syslog [192.168.3.243] out: -rw-r--r--. 1 root root 138082565 2月 22 10:23 jdk-7u79-linux-x64.rpm [192.168.3.243] out: -rw-r--r-- 1 root root 142039186 3月 13 12:09 oracle-j2sdk1.7-1.7.0+update67-1.x86_64.rpm [192.168.3.243] out: -rw-r--r-- 1 root root 15733676 6月 16 10:06 perl-5.16.1.tar.gz [192.168.3.243] out: drwxrwxr-x 6 root root 4096 2月 12 23:14 redis-3.2.8 [192.168.3.243] out: -rw-r--r-- 1 root root 1547237 6月 16 10:06 redis-3.2.8.tar.gz [192.168.3.243] out: -rw-r--r-- 1 root root 1547695 7月 6 14:51 redis-3.2.9.tar.gz [192.168.3.243] out: drwxr-xr-x 13 15399 19249 4096 9月 20 2013 tcl8.6.1 [192.168.3.243] out: -rw-r--r-- 1 root root 8755700 6月 16 10:06 tcl8.6.1-src.tar.gz [192.168.3.243] out: -rw-r--r--. 1 root root 46333 3月 7 14:09 zookeeper.out [192.168.3.243] out:
end ...
|