加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

expect实现自动交互由浅入深

发布时间:2020-12-13 14:01:32 所属栏目:Linux 来源:网络整理
导读:h1 id="expect实现自动交互由浅入深"expect实现自动交互由浅入深 作为运维人员可以通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能
命令一般步骤:

启动expect进程(spawn)--> 接收进程字符串(expect) --> 匹配字符串,成功发送字符串(send),否则等待 --> 结束

好了就直接步入主题吧,不扯那些没用的。直接上实例:

[root@localhost shell.sh]# vim test.exp
#!/usr/bin/expect
set timeout 30
spawn ssh -l root 192.168.1.106
expect {
"(yes/no)?" { send "yesr" }
"password:" { send "jiajier" }
}
interact

参数执行该实例:./test.exp

如果报错-bash: ./test.exp: Permission denied,给744权限即可。

[root@localhost shell.sh]# vim test.exp

#!/usr/bin/expect
set ip 192.168.1.106
set user root
set password jiajie
set timeout 30
spawn ssh -l $user $ip
expect {
"(yes/no)?" { send "yesr";exp_continue }
"password:" { send "$passwordr" }
}
interact

set:设置变量,后面直接变量,通过“$变量名”来调用

[root@localhost shell.sh]# vim test.exp 

!/usr/bin/expect

if {$argc!=3} {
send_user "Usage:expect need three arguments:ip user passwordn"
exit 1
}
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
set timeout 30
spawn ssh -l $user $ip
expect {
"(yes/no)?" { send "yesr";exp_continue }
"password:" { send "$passwordr" }
}
interact

[lindex $argv num]:表示位置参数,从num=0开始

send_user: 打印当前提示,相当于shell里的echo.

[root@localhost shell.sh]# vim test.exp 

!/usr/bin/expect

if {$argc!=3} {
send_user "Usage:expect need three arguments:ip user passwordn"
exit 1
}
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
set timeout 30
spawn ssh -l $user $ip
expect {
"(yes/no)?" { send "yesr";exp_continue }
"password:" { send "$passwordr" }
}
expect "]#" { send "useradd jjr" }
expect "]#" { send "echo jiajie|passwd --stdin jjr" }
send "exitr"
expect eof
exit -onexit {
send_user "useradd jj is successfully.n"
send_user "Jobs has finished,Goodbye.n"
}

执行后的结果输出:

[root@localhost shell.sh]# ./test.exp 192.168.1.106 root jiajie
spawn ssh -l root 192.168.1.106
root@192.168.1.106's password: 
Last login: Sat Sep  9 03:47:48 2017 from web
[root@localhost ~]# useradd jj
[root@localhost ~]# echo jiajie|passwd --stdin jj
Changing password for user jj.
passwd: all authentication tokens updated successfully.
[root@localhost ~]# exit
logout
Connection to 192.168.1.106 closed.
useradd jj is successfully.
Jobs has finished,Goodbye.

send "exitr":登录出当前环境。

expect eof:结束expect匹配。

exit -onexit{...}:打印结束的提示信息。

[root@localhost shell.sh]# vim test.sh

!/bin/bash

ip=$1
user=$2
password=$3
expect <<EOF
set timeout 10
spawn ssh -l $user $ip
expect {
"yes/no" { send "yesn";exp_continue }
"password" { send "$passwordn" }
}
expect "]#" { send "useradd jjn" }
expect "]#" { send "echo jiajie|passwd --stdin jjn" }
expect "]#" { send "exitn" }
expect eof
EOF

执行后的输出结果:

[root@localhost shell.sh]# ./test.sh 192.168.1.106 root jiajie
spawn ssh -l root 192.168.1.106
root@192.168.1.106's password: 
Last login: Sat Sep  9 04:10:46 2017 from web
[root@localhost ~]# useradd jj
[root@localhost ~]# echo jiajie|passwd --stdin jj
Changing password for user jj.
passwd: all authentication tokens updated successfully.
[root@localhost ~]# exit
logout
Connection to 192.168.1.106 closed.
[root@localhost shell.sh]# 

通过shell脚本通过调用expect脚本实现批量认证:

expect脚本:

[root@localhost shell.sh]# vim scp.exp

!/usr/bin/expect

if {$argc!=3} {
send_user "Usage:expect need three arguments lisk thks:file host dirn"
exit 1
}
set srcname [lindex $argv 0]
set hostname [lindex $argv 1]
set destname [lindex $argv 2]
set password "jiajie"
spawn scp $srcname root@$hostname:$destname
set timeout 30
expect {

-timeout 2

    "yes/no" {send "yesr";exp_continue}
    "*password:" {send "$passwordr"}

timeout {puts "expect connect failure,please contact admin.";return}

}
expect eof
exit -onexit {
send_user "Jobs has finished,Goodbye.n"
}

shell脚本:

[root@localhost shell.sh]# vim scp.sh 

!/bin/bash

if [[ "$#" != "2" ]];then
echo "Usage:$0 src_filename des_filename"
exit 0
fi
IP_LIST=(
192.168.1.106
192.168.1.170
192.168.1.10
)
. /etc/init.d/functions
for ip in ${IP_LIST[*]}
do
expect scp.exp $1 $ip $2 &> /dev/null
if [ $? -eq 0 ];then
action "$ip" /bin/true
else
action "$ip" /bin/false
fi
done

scp.sh脚本通过调用expect脚本来实现分发功能。执行结果如下:

[root@localhost shell.sh]# sh  scp.sh  /etc/fstab /tmp/
192.168.1.106                                              [  OK  ]
192.168.1.170                                              [  OK  ]
192.168.1.10                                               [FAILED]

因为并没有192.168.1.10所有报错。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

<h1 id="expect实现自动交互由浅入深">expect实现自动交互由浅入深

作为运维人员可以通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而Expect就使用来实现这种功能的工具。Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。

安装expect,直接yum install expect -y

解释
解释
    推荐文章
      热点阅读