expect 使用手册命令详解

expect使用手册

如何在命令行交互中自动输入参数继续执行流程?
如何在scp传输文件过程中需要输入对方机器密码时键盘输入密码?
如何在安装oracle 数据库时中间需要键盘输入某些指令?

使用场景

ssh远程连接目标机器时需要输入yes/no、密码

scp传输文件需要输入对方机器的密码,第一次建立连接还需要输入yes/no

[root@mike ~]# ssh [email protected]
[email protected]'s password:

[root@mike ~]# ssh [email protected]
The authenticity of host '192.1.99.3 (192.1.99.3)' can't be established.
ECDSA key fingerprint is SHA256:Kf1mAfMzvpLxBtkIy5P7UnJGv4Hr6NHq/CSHRHqIe60.
ECDSA key fingerprint is MD5:5c:e5:7f:64:cb:0f:be:eb:a2:9c:37:7f:9c:58:94:95.
Are you sure you want to continue connecting (yes/no)?

如果我们在手动操作非常简单,键盘上面输入密码即可,现在我希望通过一个脚本实现自动化连接该怎么做?

expect 工具横空出世,使用起来很简单

基本使用

1、安装

yum install expect -y

2、写脚本

echo " #!/usr/bin/expect -f

# 设置超时时间
set timeout 10

spawn bash -c "ssh [email protected]"

expect {
    "*password:*" { send "123456\r" }
}
interact " >> /root/test.sh

3、执行

3.1、授权可执行权限

chmod +x /root/test.sh

3.2、执行

3.2.1、全路径执行
/root/test.sh
3.2.2、当前目录下面执行
./test.sh
3.2.3、使用expect执行脚本
expect test.sh

高阶使用

一、expect 相关命令

spawn

  • 启动新的进程,与后面的expect 里面的内容做交互

send

  • 向进程发送字符串,模拟用户输入,该命令不能自动换行需要手动输入 \r 或 \n 换行

expect

  • 获取匹配信息,如果匹配成功则执行expect 后面的动作
  • expect eof :等待结束标志,由spawn 启动的进程会在结束时产生一个 eof 标记

interact

  • 执行完成后保持交互状态,将控制权交给控制台

set

  • 定义变量

  • set timeout 10 设置超时时间,默认超时时间为10秒

puts

  • 输出变量

exp_continue

  • 继续执行下面的指令,适用于多次匹配

send_user

  • 回显命令,相当于echo

二、expect 语法

单分支匹配

expect "password:*" { send "123456\r" }

多分支匹配

expect {
    "(yes/no*)?" { send "yes\r";exp_continue }
    "*password:*" { send "123445\r" }
}

exp_continue

  • 和我们开发语言中的 continue 相似,(满足条件退出当前循环,进行下一次循环)
  • 上面这个用法,如果匹配到了(yes/no*),执行完send 语句后还要继续执行下面的 password:
  • 使用时注意在前面加上一个分号 ;

三、示例

shell脚本

1、scp传输文件
#!/usr/bin/expect -f

# 设置超时时间
set timeout 10

spawn bash -c "scp /root/test.sh [email protected]:/root"

expect {
    "(yes/no*)?" { send "yes\r";exp_continue }
    "password:*" { send "123456\r" }
}

expect eof

直接执行

/usr/bin/expect << EOF
set timeout 10
spawn bash -c "db2 restore db dogdb from /tmp taken at 20231026014834"  

expect "(y/n)?" { send "y\r";exp_continue }

expect eof
EOF

你可能感兴趣的:(exect,自动化,shell)