
#!/usr/bin/expect
set timeout 10
set host_ip [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh ${host_ip}
expect {
"(yes/no)"
{
send "yes\n"
expect "assword:" { send "$password\n"}
}
"assword:"
{
send "$password\n"
}
timeout {exit 1} # 3: 这里超时就会返回 1
}
expect "100%" # 1: 等待 被spawn的程序(即前面的 ssh ${host_ip})输出 100%
expect eof # 2: 等待被spawn的程序结束
4: 可能是 ssh 本身慢导致的
输入数字不需要用try,直接用val函数转换edit字符串为整数(或者浮点数),val能返回检测是否成功,而且输入整数可以使用16进制($开头)等复杂形式,自己编写按键太复杂。程序例子如下:
var x,code:integer;
begin
val(xEditText, x, code);
if code<0 then 转换失败
继续使用数值x
end;
详细的内容可以参考下面的参考文档,下面的内容主要是为网络设备运维人员使用的pexpect 跨平台简明教程。
Expect 程序主要用于人机对话的模拟,就是那种系统提问,人来回答 yes/no ,或者账号登录输入用户名和密码等等的情况。
pexpect是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。它可以用来实现与ssh, ftp, telnet等程序的自动交互。
send命令后执行结果内容保存在buffer中,这时childexpect('keyword')后,childbefore即为“keyword”之前的字符串,childafter即为匹配的”keyword”字符串。
command的执行结果都保存在一个buffer中,每次执行expect时都从buffer中开始检查匹配的pattern,如果找到了匹配的pattern,则所有在匹配处之前的内容都从buffer中清除。
(这边没有看明白也没有关系,可以看后面的实践篇例子)
通常维护人员有的偏向于用WIN系统,有的偏向于LINUX系统。所以前期团队希望形成一个统一框架的时候就出现了一个难题。框架如何适用于不同的系统。
LInux系统pexpect包,win系统前期尝试使用winpexpect,但是程序改动很大,并没有调试成功。
如何在WIN系统使用python的pexpect包很难找到相关资料,某乎上都是类似的疑问没有解答。
团队成员增加后,终于有了新的思路 , 团结就是力量 。
通过这个模块进行不同系统的适配。
将plinkexe装在python的文件夹在python的安装目录下,win系统可以同样使用pexpect模块
参考信息1:Pexpect 官方文档 New in version 40: Windows support。Pexpect can be used on Windows to wait for a pattern to be produced by a child process, using [ pexpectpopen_spawnPopenSpawn ]
参考信息2:PuTTY是一个Telnet、SSH、rlogin、纯TCP以及串行接口连接软件。plink是可以独立使用的exe实现形式,可以让我们直接在命令行制定好命令,然后执行,完成后自动关闭session。ssh是一个安全通道协议。plink是这个通道协议的一个实现 [上传中(-572001-1587612890428-0)]
从官方文档来看,
sendline() 和 send() 唯一的区别就是在发送的字符串后面加上了回车换行符,这也使它们用在了不同的地方:
只需要发送字符就可以的话用send()
如果发送字符后还要回车的话,就用 sendline()
但是在调测过程中,WIN系统下命令输入后,childbefore始终得不到预想中的结果。
经过逐步排查,发现在WIN系统下只能使用send() ,如果使用sendline() ,第一次交互没有问题,后续交互就开始问题。
WIN系统下childbefore输出为b'byte型,做判断时要转为str型。具体可以参考最后面一篇讲编码类型的文章,讲的很详细。
例子1
send Username后,childbefore一直到'Tac_Userna',childafter为‘me:’,childbuffer为空。
expect关键字assword:后,childbefore回显一直到keyword之前,childafter为keyword,childbuffer为空。
例子2
下发command命令,childbefore维持原来的不变,expect到keyword以后,childbefore变为下发command命令后的设备回显。
参考文档
官方文档
探索Pexpect
Pexpect示例及使用Tips
Python Pexpect模块讲解
Pexpect模块使用说明
windows下使用plink实现全自动登陆ssh
Python3_字符编码
expect和expectfor的区别:
1、具体含义不同:
except用于表示同类事物之间的关系,其意为除以外、除去。exceptfor用于表示对主要部分的肯定和对局部的否定。它不表示同类事物之间的关系,其意思为:如果不是,若非。
2、用法不同:
except后面可接名词、代词、动词、副词、介词短语和从句等。exceptfor后面是加名词,有时候这个结构也可以改写成except+that从句。
例句:
TheyallwenttotheparklastSundayexcepthim
除了他以外,上星期天他们都去公园了。
Exceptforyou,Iwouldpasstheexam
如果不是你,我就会通过考试。
扩展资料
except
英文发音:[ɪk'sept]
1、用作介词(prep)
例句:
Theyallwenttosleepexceptme
除我之外,他们都去睡觉了。
2、用作连词(conj)
例句:
It'sapoortune,excepttobedancingto
这支曲子不好,除非用它作舞蹈的伴奏曲。
Iwouldbuythesuit,exceptthatitcosttoomuch
如果不是它价格太高的话,我本想买下那件衣服。
3、用作及物动词(vt)
例句:
Youwillallbepunished;Icanexceptnoone
你们全得受罚,我一个也不饶。
Anadmissionfeeischarged,butchildrenareexcepted
收取入场费,但儿童除外。
linuxexpect命令不能用于Linux系统,它是一个Perl模块,用于编写自动化脚本。它可以用于启动和控制其他应用程序,比如telnet、ftp、ssh等,以及解析输出并执行相应的命令。
/asm -logfile $logfile_basename"_cpu3212log" 这个命令打出后是提示的input->的话,
你的监视的字符应该是 expect "input->" 或者 "input"
bash调用expect的时候直接/expectTest $logfile_basename 你试一下 没有 -
以上就是关于linux expect问题全部的内容,包括:linux expect问题、delphi 语句里try 。expect的用法、pexpect 跨平台(WIN、LINUX)简明教程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)