shell expect
关键的action
spawn 调用要执行的命令
expect 捕捉用户输入的提示
send 发送需要交互的值,替代了用户手动输入内容
set 设置变量值
interact 执行完成后保持交互状态,把控制权交给控制台
expect eof 这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif
expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。
set timeout -1 设置expect永不超时
set timeout 300 设置expect 300秒超时,如果超过300没有expect内容出现,则推出
实例一:部署简单的apache,部署的脚本事先写好,expect先登录主机在远程scp到脚本本地,执行脚本
#!/usr/bin/expect
set ip [lindex $argv 0] #注意:$argv 0 是第一个参数,不是脚本名
set name [lindex $argv 1]
#三种情况:直接输密码;
#从未登录远程的主机,需要输入yes确认
#远程主机不可达
spawn ssh root@$ip
expect "(yes/no)?" {
send "yes\r"
expect "password:"
send "redhat\r"
} "password:" {send "redhat\r"} "* host" {exit 1}
#注意每个expect的情况,中间一定有个空格
expect "#"
#scp apache的部署脚本
send "scp root@172.25.12.250:/home/wxl/Desktop/shell/apache.sh /mnt\n"
expect "(yes/no)?" {
send "yes\r"
expect "password:"
send "redat\r"
} "password:" { send "redhat \r" }
expect "#"
send "sh /mnt/apache.sh $name;exit\r"
expect eof #结束标志,关闭对话
foreach的用法:相当于数组这么个概念。为数组中的每个元素都执行下面动作
实例二:
[root@server1 note]# cat sshv.sh
#!/usr/bin/expect
foreach ip {
192.168.88.121
192.168.88.123
} {
spawn ssh root@$ip
expect "(yes/no)?" {
send "yes\r"
expect "password:"
send "redhat\r"
} "password:" {send "redhat\r"} "* host" {exit 1}
expect "#"
send "hostname;exit\r"
expect eof
}
shell脚本和expect的结合:但是expect脚本里最好指定解释器
实例三:从文件中读取账户密码,expect自动登录,进行操作;
shell程序:
#!/bin/bash
for ip in `awk '{print $1}' passwd.txt`
do
pass=`awk -v i="$ip" '{if(i==$1)print $2}' passwd.txt`
#-v设定变量, 如果当前行的$1就是ip和所设定的变量ip(原来的$1)
#那么就取出$2(密码)
expect vssh.sh $ip $pass
done
expect程序:
和实例一差不多。
pass.txt:
172.25.12.11 redhat
172.25.254.18 centos
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!