安装

Ubuntu

  1. apt install -y expect

一、概念

Expect是UNIX系统中用来实现自动化控制和测试的软件工具,作为Tcl脚本语言的一个扩展应用在交互式软件中,如Telnet、FTP、SSH等。

执行shell脚本,需要从终端得到输入时(如ssh root@192.168.1.2),Expect可以根据提示,模拟标准输入来实现交互脚本执行

可以把shell和expect理解为两种不同的脚本语言,expect有独自的语法、变量

二、ssh远程主机的方式
2.1.简单方式,直接使用expect命令

  1. #!/bin/bash
  2. #登陆远程主机并查看主机名
  3. IP="192.168.1.2"
  4. USERNAME="root"
  5. PWD="123456"
  6. expect << EOF
  7. set timeout 6
  8. spawn ssh ${USERNAME}@${IP} -o "StrictHostKeyChecking no"
  9. expect "password:" {send "${PWD}\r"}
  10. expect "#" {send "hostname\r"}
  11. expect "#" {send "exit\r"}
  12. EOF

脚本介绍:

  1. expect << EOF
  2. .......
  3. EOF #表示里面的内容均由expect命令去执行
  4. set timeout 6 #设置超时时间为6秒,下面的代码需在6秒钟内完成,如果超过,则退出。用来防止ssh远程主机网络不可达时卡住及在远程主机执行命令宕住
  5. spawn #激活一个交互式会话,在系统中创建一个进程
  6. ssh ${USERNAME}@${IP} #ssh登陆远程主机
  7. -o "StrictHostKeyChecking no" #不弹出“(yes/no)?”的对话框
  8. expect "password:" #期望终端出现包含"password:"的字段。如果没有出现,则不执行后面的代码,会卡在此处,达到超时时间退出。
  9. {send "${PWD}\r"} #传递给交互终端的指令,这里是发送密码。\r相当于在终端敲了下回车
  10. {send "hostname\r"} #向远程主机发送hostname的指令
  11. {send "exit\r"} #最后一个expect不会执行,因此不会发送exit的指令,这里用来标识该expect要退出了

2.2.稍复杂方式,shell脚本调用expect脚本,并传入参数(推荐)
shell脚本

  1. #!/bin/bash
  2. IP="192.168.1.2"
  3. USERNAME="root"
  4. PWD="123456"
  5. /usr/bin/expect -f expect.exp ${IP} ${USERNAME} ${PWD}

expect脚本expect.exp

  1. #!/usr/bin/expect -f
  2. #位置参数会存入数组$argv,与shell不一样
  3. set IP [lindex $argv 0]
  4. set USERNAME [lindex $argv 1]
  5. set PWD [lindex $argv 2]
  6. set timeout 6
  7. spawn ssh ${USERNAME}@${IP}
  8. expect {
  9. #如果有yes/no关键字
  10. "yes/no" {
  11. #则输入yes
  12. send "yes\n"
  13. #输入yes后如果输出结果有"*assword:"关键字,则输入密码
  14. expect "*assword:" { send "${PWD}\n" }
  15. }
  16. #如果上次输出结果有"*assword:"关键字,则输入密码
  17. "*assword:" { send "${PWD}\n" }
  18. timeout { send_error "User 'root' login timeout.\n"; exit 1; }
  19. }
  20. expect "#"
  21. send "hostname\r"
  22. expect "#"
  23. send "exit\r"
  24. expect eof

原文链接:https://blog.csdn.net/anqixiang/article/details/110181689