expect使用

有些命令却需要用户手动去就交互如passwd、scp

对自动部署免去用户交互很痛苦,expect能很好的解决这类问题。

expect的核心是spawn expect send set

spawn 调用要执行的命令

expect 等待命令提示信息的出现,也就是捕捉用户输入的提示:

send 发送需要交互的值,替代了用户手动输入内容

set 设置变量值

interact 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。

expect eof 这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif

expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。

设置expect永不超时

set timeout -1

设置expect 300秒超时,如果超过300没有expect内容出现,则退出

set timeout 300

使用实例:

批量发送ssh秘钥

allip=`nmap -v -sP 192.168.238.0/24|grep 192.168|grep -v "down"|grep -v 192.168.238.2 |cut -d " " -f5 2>/dev/null` 通过nmap扫描ip,获取ip

[ ! -x /usr/bin/expect ] && yum install expect -y  判断是否安装了expect因为默认是没有安装的

下面就是一个循环了

for i in $allip;do

if [[ $i =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]];then

/usr/bin/expect <<EOF

set timeout 10

spawn ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]$i

expect {

"password" {send "redhat\n"}

}

expect eof

EOF

这样就可以自动把自己主机上的秘钥发送到对应的主机上面

时间: 2024-10-26 11:22:40

expect使用的相关文章

shell脚本交互:expect学习笔记及实例详解

最近项目需求,需要写一些shell脚本交互,管道不够用时,expect可以很好的实现脚本之间交互,搜索资料,发现网上好多文章都是转载的,觉得这篇文章还不错,所以简单修改之后拿过来和大家分享一下~ 1. expect是spawn: 后面加上需要执行的shell命令,比如说spawn sudo touch testfile 1.3 expect: 只有spawn执行的命令结果才会被expect捕捉到,因为spawn会启动一个进程,只有这个进程的相关信息才会被捕捉到,主要包括:标准输入的提示信息,Li

expect 使用实例

shell脚本实现ssh自动登录远程服务器示例: #!/usr/bin/expect spawn ssh [email protected] expect "*password:" send "123\r" expect "*#"interact Expect是一个用来处理交互的命令.借助Expect,我们可以将交互过程写在一个脚本上,使之自动化完成.形象的说,ssh登录,ftp登录等都符合交互的定义.下文我们首先提出一个问题,然后介绍基础知四个

centos 7 expect + shell实现批量创建文件

这个问题好久了,一直没整理出来.记得还是上次面试的时候问到如何批量修改1000台机器的主机名.这里给出批量创建内容为Hello,名为1.txt的文件. 一.首先安装expect yum install -y expect 二.准备工作:(1)准备IP地址的列表.vim ip.txt 192.168.1.88 192.168.1.89 192.168.1.90 (2)准备要执行的命令.vim cmd.txt mkdir /tmp/test 三.脚本部分 #!/bin/bash passwd="12

bash嵌套expect实现交换机的交互式登录实例

1. expect实现参数传递 1.1 实现 $argv 参数数组 expect脚本可以接受从bash传递过来的参数. 可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个....参数 1.2 样例 cat telnet.exp #!/usr/bin/expect set host [lindex $argv 0] set passwd [lindex $argv 1] set passwden [lindex $argv 2] spawn telnet $h

【扫描线】Gym - 101190E - Expect to Wait

假设初始人数为0, 将每个时刻在等待的人数写下来,就是求个和. 如果纵坐标看成人数,横坐标看成时间,就是求个面积. 因为初始人数不一定为零,所以离线后扫描线即可回答所有询问. #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; int n,m,e; struct LINE{ int y,l,id; }ls[200010]; bool cmp(const LINE &a

expect 实现交互(未完成)

expect介绍 expect命令是一个实现交互功能的软件套件,是基于TCL的脚本编程语言,在企业运维中,系统会以交互的形式要求运维人员输入指定的字符串,之后才能继续执行命令.例如:为用户设置密码时,一般情况下需要手工输入两次密码,比如使用ssh连接远程服务器时,第一次连和系统实现两次交互. 简单的说,expect用来自动实现与交互程序通信的,无需管理员手工干预 spawn启动指定进程>expect获取期待的关键字>send向指定进程发送字符>进程执行完毕,退出 expect  表达式 

神奇的expect

想写自动化脚本的时候,遇到需要交互的,如ssh,scp,就束手无策,直到我知道了expect. expect 有一系列expect-send对组成,就像聊天一样. expect A send B expect C send D 先来个例子 #!/usr/bin/expect set timeout 5 spawn ssh 192.168.2.38 expect "password" {send "slk\n"} expect "Last login&quo

Expect使用小记

By francis_hao    May 31,2017 本文翻译了部分Expect的man手册,只选取了个人常用的功能,因此并不完善. Expect是一个可以和交互式程序对话的程序 概述 介绍 通过脚本,Expect可以知道应该从对话程序中期望得到什么,和应该回应什么.它支持多分支结构,并且用户可以在需要的时候取得控制权,并在之后将控制权交还给脚本. Expect也可以被直接用在c或c++中,详见libexpect(3). Expect可以做的事情:telnet.ftp.ssh和scp等等(

Linux expect 案例

#!/usr/bin/expect set host "192.168.31.100" set password "lishiming" spawn ssh [email protected]$host expect { "yes/no" { send "yes\r"; exp_continue } "assword:" { send "$password\r" } } expect &