千家信息网

Shll编程之Expect免交互

发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,Shll编程之Expect免交互1.Expect概述2.Expect安装(底层语言Tcl)3.Expect基本命令4.Expect执行方式5.Expect案例Expect概述:1.Expect是建立在
千家信息网最后更新 2024年11月22日Shll编程之Expect免交互

Shll编程之Expect免交互

1.Expect概述

2.Expect安装(底层语言Tcl)

3.Expect基本命令

4.Expect执行方式

5.Expect案例

Expect概述:

1.Expect是建立在tcl语言基础上的一个工具,Expect是用来进行自动化控制和测试的工具。主要解决shell脚本中不可交互的问题。对于大规模的linux运维很有帮助。

2.在linux运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互的过程,可能会余姚输入yes/no password等信息。为了模拟这种输入,可以使用Expect脚本。

Expect安装

1.挂载光盘

2.制作本地YUM源

执行安装命令:yum -y intall expect

基本命令:

1.send:向进程发送字符串,用于模拟用户的输入

该命令不能自动回车换行,一般要加\r(回车)

2.expect

expect的一个内部命令判断上次输出结果里是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回

只能捕捉由spawn启动的进程的输出

#####3.spawn:启动进程,并跟踪后续交互信息

4.interact:执行完成后保持交互状态,把控制权交给控制台
5.Timeout:指定超时时间,过期则继续执行后续指令

单位是:秒

timeout -1为永不超时

默认情况下,timeout是10秒

6.exp_continue

允许expect继续向下执行指令

7.send_user:

回显命令,相当于echo

8.$argv参数数组:

Expect脚本可以接受从bash传递的参数,可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个....参数

9.Expect脚本必须以interact或expect ecof结束,执行自动化任务通常expect eof就够了

expect eof实在等待结束标志。由spawn启动的命令在结束时会产生一个eof标记,expect eof即在等待这个标记

Expect执行方式:

直接执行
[root@ce~]#more a.sh#!/usr/bin/expect       //Expect二进制文件的路径    set timeout 60      //60秒等待时间    log_file test.log       //日志文件    log_user 1              //日志用户    set hostname [lindex $argv 0]       //追加参数0,统计变量,加载第1位置    set password [lindex $argv 1]       //追加参数1,统计变量,加载第2位置    spawn ssh root@$hostname    expect {        //进行匹配            "(yes/no)"            {send"yes/r";exp_continue}      //输入yes,继续执行            "*password"     //参数2            {send"$password\r"}     //交给控制台人为输入    }interact[root@ce~]#chmod a+x a.sh[root@ce~]#./a.sh
Demo1:远程登录
[root@localhost opt]# yum install expect -y     //安装服务[root@localhost opt]# vim a.sh#!/usr/bin/expect#超时时间set timeout 20log_file test.loglog_user 1#参数传入set hostname [lindex $argv 0]set password [lindex $argv 1]#追踪命令spawn ssh root@$hostname#捕捉信息并且匹配,免交互执行expect {        "(yes/no)"        {send "yes\r";exp_continue}        "*password"        {send "$password\r"}}#控制权交给控制台执行interact[root@localhost opt]# chmod +x a.sh[root@localhost opt]# ./a.sh 192.168.56.129 123123spawn ssh root@192.168.56.129The authenticity of host '192.168.56.129 (192.168.56.129)' can't be established.ECDSA key fingerprint is SHA256:DSqXtMX4L3DIIYCai7ACEftdbCIH5n0Y5SPpGCzsjdw.ECDSA key fingerprint is MD5:14:93:39:65:27:31:a6:28:8b:28:d1:2c:fb:32:7b:4d.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added '192.168.56.129' (ECDSA) to the list of known hosts.root@192.168.56.129's password: Last login: Thu Oct 10 09:46:08 2019 from 192.168.56.1//此时已远程登录对方主机[root@localhost ~]# 登出      //按Ctrl+d退出远程登录Connection to 192.168.56.129 closed.
嵌入执行:
[root@ce~]#more b.sh#!/bin/bash    hostname=$1    password=$2    /usr/bin/expect<<-EOF    spawn ssh root@${hostname}    expect {        "(yes/no)"        {send "yes\r";exp_continue}        "*password"        {send"$password\r"}    }    expect "*]#"    send "exit\r"    expect eofEOF[root@ce~]#source b.sh
Demo2:登录远程控制后自动退出
[root@localhost opt]# vim b.sh#!/bin/bashhostname=$1password=$2/usr/bin/expect<<-EOFspawn ssh root@${hostname}expect {        "(yes/no)"        {send "yes\r";exp_continue}        "*password"        {send "$password\r"}}expect "*]#"send "exit\r"expect eofEOF[root@localhost opt]# chmod +x a.sh[root@localhost opt]# ./a.sh 192.168.56.129 123123spawn ssh root@192.168.56.129The authenticity of host '192.168.56.129 (192.168.56.129)' can't be established.ECDSA key fingerprint is SHA256:DSqXtMX4L3DIIYCai7ACEftdbCIH5n0Y5SPpGCzsjdw.ECDSA key fingerprint is MD5:14:93:39:65:27:31:a6:28:8b:28:d1:2c:fb:32:7b:4d.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added '192.168.56.129' (ECDSA) to the list of known hosts.root@192.168.56.129's password: Last login: Thu Oct 10 09:46:08 2019 from 192.168.56.1[root@localhost ~]# 登出Connection to 192.168.56.129 closed.//自动退出远程控制
EOF容错只能容制表符TAB,但是空格不行

Demo3:创建用户tom,密码tom123

[root@localhost opt]# vim c.sh#!/bin/bash  user=$1password=$2#非交互命令放在expect外面useradd $user#开始进行交互expect << EOF  spawn passwd $user  expect "新的*"  send "${password}\r"  expect "重新*"  send "${password}\r"  expect eof;  EOF[root@localhost opt]# chmod +x c.sh[root@localhost opt]# ./c.sh tom tom123spawn passwd tom更改用户 tom 的密码 。新的 密码:无效的密码: 密码少于 7 个字符重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。[root@localhost opt]# su zhou       //切换普通用户zhou[zhou@localhost opt]$ su tom        //切换新创建的普通用户tom密码:                             //提示输入密码[tom@localhost opt]$                //此时进入tom用户

SSH远程登录代码健壮版

#!/usr/bin/expect #超时时间  set timeout 20log_file test.log log_user 1#参数传入set hostname [lindex $argv 0]set password [lindex $argv 1]#追踪命令spawn ssh root@$hostname#捕捉信息并且匹配,免交互执行expect {        "Connection refused" exit        "service not known" exit        "(yes/no)"        {send "yes\r";exp_continue}        "*password"         {send "$password\r"}}#控制权交给控制台执行interactexit
0