expect脚本使用
一、概述
我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而expect就使用来实现这种功能的工具。
安装expect
yum -y install expect
四个命令
Expect中最关键的四个命令是send,expect,spawn,interact
send:用于向进程发送字符串
expect:从进程接收字符串
spawn:启动新的进程,执行命令
interact:允许用户交互
二、实例
在使用ansible时,需要进行ssh互信认证,及ansible操作端服务器需要免密登录其他被控制端服务器。
如果服务器太多,一个一个输入账户密码就特别繁琐了,此时可以通过expect脚本完成交互式操作。
1.先将需要免密登录的远程服务器IP写入到hosts.txt文件,方便后续脚本调用
2.编写脚本如下:
注:复制执行脚本时把中文注释去掉,否则会有问题
#!/usr/bin/expect set timeout -1 #设置超时时间,永不超时 set username danny #设置SSH用户名 set password danny123 #设置密码 set hosts [open hosts.txt r] #以只读的方式将hosts.txt中的值赋值给hosts参数 while { [gets $hosts IP] >= 0 } { spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $username@$IP #spawn启动脚本或命令的会话,以衍生子进程的方式来运行。 expect { "yes/no" {send "yes\r"; exp_continue} #交互式操作,输入yes再回车 "password:" {send "${password}\r"} #输入密码,回车 } expect eof
#子进程运行完成之后,会得到标识子进程已经结束的eof字符,脚本结束(和spawn对应,当spawn发送指令到终端执行,在返回时被expect捕捉时,在起始会有一个eof标识字符) } close $hosts
执行(不要用sh auto_ssh.sh执行,这是expect脚本,会报格式错误)
./auto_ssh.sh
附两个远程上传脚本示例:
脚本1、
#!/usr/bin/expect set username danny set password danny123 set port 21435 set host 192.168.1.10 set argv [lindex $argv 0] set timeout -1 spawn scp -P $port -o StrictHostKeyChecking=no -r $argv $username@$host:/home/danny expect "password:" send "$password\r" expect eof exit
执行:
./auto_scp.sh xxx.tar.gz
脚本2::
#!/bin/bash cd /root/product/ auto_smart_scp () { expect -c "set timeout -1; spawn scp $@; expect { *assword:* {send $pass\r; expect { *denied* {exit 2;} eof } } eof {exit 1;} } " return $? } pass='danny123' auto_smart_scp -P 21435 -o StrictHostKeyChecking=no -r $1 root@192.168.1.10:/root/temp
执行
sh auto_scp.sh xxx.tar.gz
好记性不如烂笔头,最难不过坚持
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了