版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/87904499
一 run函数
run是使用pexpect进行封装的调用外部命令的函数,类似于 os.system或os.popen方法,不同的是,使用run()可以同时获得命令的输出结果及命令的退出状态。
函数定义
pexpect.run(command, timeout=–1,withexitstatus=False,events=None,extra_args=None, logfile=None,cwd=None,env=None)
- command:是系统已知的任意命令,如没有写绝对路径时,将会尝试搜索命令的路径。
- events:是一个字典,定义了expect及sendline 方法的对应关系。
spawn方式例子:
from pexpect import *
child = spawn('scp foo [email protected]:.')
child.expect('(?!)password') # 表示所在位置右侧的表达式开启忽略大小写模式
child.sendline(mypassword)
使用run函数实现如下,使用更加简洁:
from pexpect import *
run('scp foo [email protected]:.', events={'(?!)password': mypassword})
二 pxssh类
pxssh是pexpect的派生类,针对在ssh会话操作上再做一层封装,提供与基类更加直接的操作方法。
pxssh类定义
class pexpect.pxssh.pxssh(timeout=30, maxread=2000, searchwindowsize=None, logfile=None, cwd=None, env=None)
pxssh常用的三个方法如下:
- login()建立ssh连接。
- logout()断开连接。
- prompt()等待系统提示符,用于等待命令执行结束。
三 实战
1 点睛
下面使用pxssh类实现一个ssh连接远程主机并执行命令的示例。
首先使用login()方法与远程主机建立连接,再通过sendline()方法发送执行的命令,prompt()方法等待命令执行结束且出现系统提示符, 最后使用logout()方法断开连接。
2 代码
from pexpect import pxssh
import getpass
try:
s = pxssh.pxssh() # 创建pxssh对象s
hostname = raw_input('hostname: ')
username = raw_input('username: ')
password = getpass.getpass('password: ') # 接收密码输入
s.login (hostname, username, password) # 建立ssh连接
s.sendline ('uptime') # 运行uptime命令
s.prompt() # 匹配系统提示符
print s.before # 打印出现系统提示符前的命令输出
s.sendline ('ls -l')
s.prompt()
print s.before
s.sendline ('df')
s.prompt()
print s.before
s.logout()
except pxssh.ExceptionPxssh, e:
print "pxssh failed on login."
print str(e)
3 结果
[root@localhost pymaintain]# python 5_2_3.py
hostname: 192.168.0.104
username: root
password:
uptime
14:34:35 up 2:18, 5 users, load average: 0.00, 0.01, 0.05
ls -l
total 81920
drwxr-xr-x. 2 root root 6 Aug 6 2017 123
-rw-r--r--. 1 root root 1344512 Nov 11 2017 33.tar
-rw-r--r-- 1 root root 33112 Jan 20 2018 zookeeper.out
df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 20961280 2959572 18001708 15% /
devtmpfs 494100 0 494100 0% /dev
tmpfs 508428 0 508428 0% /dev/shm
tmpfs 508428 7188 501240 2% /run
tmpfs 508428 0 508428 0% /sys/fs/cgroup
/dev/sda5 10475520 5028196 5447324 48% /usr
/dev/sda2 31441920 7330772 24111148 24% /var
/dev/sda7 37214460 32928 37181532 1% /mydata
/dev/sda1 508588 156276 352312 31% /boot
tmpfs 101688 0 101688 0% /run/user/0
[root@localhost pymaintain]#