此类扩展pexpect.spawn以专门设置ssh连接。pexpect.spawn也可实现ssh连接功能。
此类的好处是替我们处理了在ssh连接中许多不难但是非常麻烦问题。比如使用spawn在登录ssh时需要匹配已登录的关键字,发送命令后,需要匹配命令已完成的关键字。这些关键字都可能因为系统的不同而不同,每次都一个一个配,虽然是可行的,但是十分麻烦。所以涉及ssh的地方,建议使用pxssh。
如果在ssh使用过程中,服务器行为有一些非典型的linux shell行为(如堡垒机首页,甚至不支持linux命令),总之pxssh的默认设置不再有效时,pxssh用起来也不方便,甚至不如直接使用spawn。
class pexpect.pxssh.pxssh(timeout=30, maxread=2000, searchwindowsize=None, logfile=None, cwd=None, env=None, ignore_sighup=True, echo=True, options={}, encoding=None, codec_errors='strict', debug_command_string=False)
举例:
from pexpect import pxssh
import getpass
try:
s = pxssh.pxssh()
hostname = raw_input('hostname: ')
username = raw_input('username: ')
password = getpass.getpass('password: ')
s.login(hostname, username, password)
s.sendline('uptime') # run a command
s.prompt() # match the prompt
print(s.before) # print everything before the prompt.
s.sendline('ls -l')
s.prompt()
print(s.before)
s.sendline('df')
s.prompt()
print(s.before)
s.logout()
except pxssh.ExceptionPxssh as e:
print("pxssh failed on login.")
print(e)
PROMPT
这是shell提示符,如果默认的提示符不能正常工作,可能需要手动设置该字段。
options
这是ssh登录时的参数设置
java login(server, username, password='', terminal_type='ansi', original_prompt='[#$]', login_timeout=10, port=None, auto_prompt_reset=True, ssh_key=None, quiet=True, sync_multiplier=1, check_local_ip=True, password_regex='(?i)(?:password:)|(?:passphrase for key)', ssh_tunnels={}, spawn_local_ssh=True, sync_original_prompt=True, ssh_config=None)
original_prompt
这是原始提示符匹配,一般服务器是"#“或”$"。
auto_prompt_reset
默认是True,如果设置为Fasle,则prompt将会变成唯一的,并且在使用prompt()方法前需要手动设置PROMPT.
password_regex
如果登录欢迎词含有单词"password"时,可能需要设置这个字段以进行严格匹配。
spawn_local_ssh
默认True.如果在当前ssh连接中使用ssh命令,默认会使用一个新的会话,设置spawn_local_ssh=False则依然使用当前会话
logout()
退出,同linux命令logout
prompt(timeout=-1)
匹配shell提示符,当执行完一条命令后,shell会返回提示符模式,所以这个方法的作用就是匹配命令已完成。它封装了expect()方法。同时会删除before属性的内容。
sync_original_prompt(sync_multiplier=1.0)
调用这个方法child会尝试发送‘enter’,每次‘enter’都会得到shell prompt,此方法的目的就是通过比较多次的prompt得到准确的prompt
set_unique_prompt()
这会将远程提示设置为比‘$#’更独特的内容。这使得prompt()更容易明确匹配shell提示。此方法由login()自动调用,但如果以某种方式重置shell提示,则可能需要手动调用它。例如,如果“su”到另一个用户,则需要手动重置提示。
或者,可以使用设置的提示模式。在这种情况下,应该使用auto_prompt_reset=false调用login(),然后手动设置PROMPT属性。之后,prompt()将按照设置的PROMPT属性匹配。
文章目录说明API结构核心组件创建Spawn方法Controlling the child processrun functionExceptionsUtility Functionsfdpexpectpopen_spawnreplwrappxssh基本用法重要方法说明文档参考(翻译)自官方文档(地址),加入了一些我在使用过程中的心得体会。间略了我认为不重要的内容。间略了我不懂的内容。水平有限...
Pexpect是一个用来启动子程序并对其进行自动控制的Python模块,它可以用来和像ssh,ftp,passwd,telnet等命令行程序进行自动交互。
下载安装:
http://sourceforge.net/projects/pexpect/
概念理解:
Expect 程序主要用于人机对话的模拟,就是那种系统提问,人来回答 yes/no ,或者账号登录输入用户名和密码等等的情况。
Expect 程序主要用于人机对话的模拟,就是那种系统提问,人来回答 yes/no ,或者账号登录输入用户名和密码等等的情况。因为这种情况特别多而且繁琐,所以很多语言都有各种自己的实现。最初的第一个 Expect 是由 TCL 语言实现的,所以后来的 Expect 都大致参考了最初的用法和流程,整体来说大致的流程包括:
程序要求人的判断和输入
Expect 通过关键字匹...
一、pexpect模块介绍
Pexpect使Python成为控制其他应用程序的更好工具。可以理解为Linux下的expect的Python封装,通过pexpect我们可以实现对ssh,ftp,passwd,telnet等命令行进行自动交互,而无需人工干涉来达到自动化的目的
二、Pexpect的安装
#python2
pip install pexpect
#python3
pip3 install pexpect
三、pexpect的核心组件
3.1 spawn类
是Pexpect库的主要对象即接
child = pexpect.popen_spawn.PopenSpawn('ssh root@xxx.xxx.xxx.xxx')
# a = child.expect(':')
# print(a)
logFileId = open("logfile.txt", 'wb')
child.logfile = logFil