实现真正的自动化,expect脚本语言使用
expect中的几个重要句子:
expect的核心是spawn expect send set
spawn 调用要执行的命令
expect 等待命令提示信息的出现,也就是捕捉用户输入的提示:
send 发送需要交互的值,替代了用户手动输入内容
set 设置变量值
interact 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。
expect eof 这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif
set timeout -1表示无超时时间
set timeout 10表示超时时间为10秒
注意:expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。
------------------------------------------------------------
实例:ssh 远程登录,发送reboot指令
vim reb.expect
#!/usr/bin/expect -f set timeout 10 set username root #定义变量 set hostname 192.168.137.28 set password redhat spawn ssh "[email protected]$hostname" #执行命令 expect { #捕捉信息的提示,以进入下一步的命令输入 "yes/no" {send "yes\r";exp_continue} #exp_continue表示继续下一步 "password:" {send "$password\r"} } expect "#" send "shutdown -r now\r" #重启命令 send "exit\r" #退出登录 expect eof #终止expect的捕捉 exit
------------------------------
实现停留在远程主机:
#!/usr/bin/expect -f set timeout 10 set username root set hostname 192.168.137.28 set password redhat spawn ssh "[email protected]$hostname" expect { "yes/no" {send "yes\r";exp_continue} "password:" {send "$password\r"} } expect "#" send "ll ; df -hT\r" #send "exit\r" #expect eof interact #执行完后保持交互的模式,此时可以手工操作 exit
------------------------------------------------------------
在脚本中引用expect脚本:expect -c ""
vim reb.sh
#!/bin/bash username="root" hostname="192.168.137.28" password="redhat" expect -c " #-c 实现调用 ##注意凡是-c后调用的内容,如果带有""双引号的话,必须用\进行转义,否则报错 set timeout 10 spawn ssh \"[email protected]$hostname\" expect { \"yes/no\" {send \"yes\r\";exp_continue} \"password:\" {send \"$password\r\"} } expect \"]#\" send \"ll\r\" interact exit "
--------------
expect -c <<EOF
.......
EOF
使用这个种方式的时候,不能停留在远程主机上
时间: 2024-11-07 01:47:03