您的位置:首页 > 其它

expect 自动完成交互式程序神器

2018-02-08 23:42 621 查看
expect安装

yum-yinstallexpect#Centos
sudoapt-getinstallexpect#Ubuntu


作用:自动填写交互式程序的值.

原理:通过读取交互式问题的关键字来判断具体执行什么操作

特性:

一个expect块负责一个交互问题,若expect块里的条件不匹配问题,则等待超时时间(timout),然后检测下一个expect块语句.

一个expect块里可以同时存在多个匹配关键字符串,若其中一个字符串匹配成功,执行完相应的操作后直接退出该
expect块,下一个交互式问题交给下一个expect块处理,不会再重新考虑expect块的其他条件

如果想在expect语句块里,某个条件命中后继续使用当前的expect块匹配处理下一个交互式问题,则需要在命中的
语句后面加上:exp_continue,但注意这容易产生死循环,请确保匹配字符串是唯一的

可以在expect语句块里面使用eof来实现条件逻辑或判断.

相关参数:

timeout    设置匹配等待的超时时间
spawn创建一个通道使得expect上下文中可以执行shell命令
expect设置期望值,即交互式问题中预期绘出现的关键字,及再匹配成功后采取相应的动作
send发送的字符串,比如输入登陆的账号密码,linux使用\r代表回车按键
set初始化变量
interact将控制权交给终端,否则绘退出登陆
expect主要是在自动化登陆方面用的比较多,这里列举一个例子来说明expect的用途

在账号密码提前写好,然后自动的ssh登陆服务器,通过expect脚本就可以实现

文件名:[login.exp]

#!/usr/bin/expect

sethost192.168.1.2
setport22
setuserroot
setpassyourPassWD

spawnssh$user@$host-p$port

expect{
"yes/no"{send"yes\r"}
"password:"{send"$pass\r"}
eof
"password:"{send"$pass\r"}
}

expect"$user@"
send"cd/tmp\r"
send"echologinsuccessfully\r"

interact


执行测试

root@demon-PC:/project#expectlogin.exp
spawnsshroot@192.168.1.2-p22
root@192.168.1.2'spassword:
Lastlogin:ThuFeb822:41:312018from192.168.1.104

WelcometoDemonServer!

[root@demon~]#cd/tmp
[root@demontmp]#echologinsuccessfully
loginsuccessfully

批量登陆处理服务器

expect支持从外部传入参数,然后进行处理,通过if语句判断参数个数,来选择ssh登陆的类型

1.密码登陆  (4个参数)

2.密钥登陆  需指明密钥文件路径(5个参数)

将账号密码写入到一个文件里头

文件名:[loginfile]

192.168.1.222root123456
192.168.1.322root123123
192.168.1.422rootkeyPass/root/.ssh/id_rsa


通过awk读取文件,将其作为参数传给expect

文件名:[login.sh]

#!/bin/bash
#@Author:Demon

awk'
{
host=$1;
port=$2;
user=$3;
pass=$4;
if($5)system("expect/tmp/ssh.exp"host""port""user""pass""$5);
elsesystem("expect/tmp/ssh.exp"host""port""user""pass);
}'loginfile


expect接收参数,并进行ssh登陆

文件名:[ssh.exp]

!/usr/bin/expect

#@Author:Demon

#Howtouse?
#ssh.exp192.168.1.222rootyouSSHPassWd
#ssh.exp192.168.1.222rootyouKeyPassWd/path/to/RSA.rsa

#MUST
setREMOTE_HOST[lindex$argv0]
setREMOTE_PORT[lindex$argv1]
setREMOTE_USER[lindex$argv2]
setREMOTE_PASS[lindex$argv3]
setREMOTE_RSA[lindex$argv4]

setTIMEOUT3

if{"$argc"=="4"}{

spawnssh$REMOTE_USER@$REMOTE_HOST-p$REMOTE_PORT

expect{
"yes/no"{send"yes\r";exp_continue}#firstsshloginbanner
"password:"{send"$REMOTE_PASS\r"}

eof
"password:"{send"$REMOTE_PASS\r"}

eof
"Permissiondenied"{spawnecho"needthepathtorsafile"}#ifnopathtoRSAfile
}

}elseif{"$argc"=="5"}{

spawnssh$REMOTE_USER@$REMOTE_HOST-p$REMOTE_PORT-i"$REMOTE_RSA"

expect{
"yes/no"{send"yes\r";exp_continue}#firstsshloginbanner
"Enterpassphraseforkey"{send"$REMOTE_PASS\r"}
eof
"Enterpassphraseforkey"{send"$REMOTE_PASS\r"}
}
}else{

spawnecho"ToofewParameters"
spawnecho"Howtouse?"
spawnecho"ssh.exp192.168.1.222rootyouSshPassWd"
spawnecho"ssh.exp192.168.1.222rootyouKeyPassWd/path/to/RSA.rsa"
}

#dosomethinginremoteserver
expect"$REMOTE_USER"
send"mkdir-p/tmp/hello\r"
send"cd/tmp/hello\r"
send"touchHelloWorldDemonComeHere\r"

#WrittenbyDemon



最后执行bashlogin.sh就可以批量处理了

转载请指明:http://www.cnblogs.com/demonxian3/p/8433637.html

推荐学习网址:https://www.waitig.com/linux-expect-command-for-while-and-if-else.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐