https://developer.aliyun.com/article/885723?spm=a2c6h.24874632.expert-profile.295.7c46cfe9h5DxWK
简介: expect非交互式 expect可以在脚本中完成一些交互式的操作,例如远程登录时要输入yes或者输入密码 expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。 expect自动交互流程:

expect非交互式

expect可以在脚本中完成一些交互式的操作,例如远程登录时要输入yes或者输入密码

expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。

expect自动交互流程:

spawn启动指定进程—expect获取指定关键字—send向指定程序发送指定字符—执行完成退出.

expect常用命令总结:

spawn               交互程序开始后面跟命令或者指定程序
expect 获取匹配信息匹配成功则执行expect后面的程序动作
send exp_send 用于发送指定的字符串信息
exp_continue 在expect中多次匹配就需要用到
send_user 用来打印输出 相当于shell中的echo
exit 退出expect脚本
eof expect执行结束 退出
set 定义变量
puts 输出变量
set timeout 设置超时时间

1.实现非交互式远程登录

如果由于ssh服务原因导致超过10秒则expect不会再输入,需要手动输入

在sshd_config文件中加上UseDns no即可避免

#!/usr/bin/expect
spawn ssh root@192.168.81.210
expect {
"*yes/no" { send "yes/r"; exp_continue }
"*password:" { send "redhat/r" }
}
interacts

这里的expect也是expect的一个内部命令,expect的shell命令和内部命令是一样的,但不是一个功能。

“*yes/no” { send “yes\r”; exp_continue}这个命令的意思是判断上次输出结果是否包含“yes/no”的字符串,如果有则执行“yes”,并继续执行(exp_continue)。

“*password:” { send “redhat\r” }这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,并自动输入密码,否则就等待一段时间后返回,这里等待时长就是前面设置的10秒。

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

2.实现非交互式scp传输文件

由于scp不需要交互,所以不需要写interact,interact结束交互式由管理员进行结束的,面对不需要交互的使用expect eof来结束

#!/usr/bin/expect
#---------------利用expect实现scp非交互传文件------------------
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password redhat
set tiemout 20
spawn scp -r /etc/hosts $user@$ip:/root
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "$password\r" }
}
expect eof

2.批量推送主机公钥

#!/bin/bash
#---------------批量推送主机公钥------------
rpm -qa |grep expect &>/dev/null
if [ $? -ne 0 ];then
yum -y install expect
fi if [ ! -f ~/.ssh/id_rsa ];then
ssh-keygen -P "" -f ~/.ssh/id_rsa
fi for i in {3..254}
do
{
ip=192.168.81.$i
local_ip=`ifconfig | grep inet | head -1 |awk '{print $2}'`
if [ "$ip" = "$local_ip" ];then
continue
fi
ping -c1 -W1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip"
expect <<-EOF
set timeout 10
spawn ssh-copy-id $ip
expect {
"yes/no" { send "yes\r"; exp_continue }
"*password:" { send "redhat\r" }
}
expect eof
EOF
fi
}&
done
wait
echo "finish........"

3.批量远程修改各个主机的基本配置

做这个前提需要做一下公钥推送,否则需要进行交互

#!/bin/bash
#--------------------批量远程修改各个主机的基本配置-------------------------
for ip in $(cat ip.txt)
do
ping -c1 -W1 $ip &>/dev/null
{
if [ $? -eq 0 ];then
ssh $ip "sed -ri '/^UseDns/c\UseDns no' /etc/ssh/sshd_config"
ssh $ip "sed -ri '/^GSSAPIAuthentication/c\GSSAPIAuthentication no' /etc/ssh/sshd_config"
ssh $ip "sed -ri '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config"
ssh $ip "systemctl stop firewalld; systemctl disable firewalld"
ssh $ip "iptables -F"
ssh $ip "setenforce 0"
fi
}&
done
wait
echo "all finish..."

[转帖]Shell脚本中利用expect实现非交互式的更多相关文章

  1. 转 在shell脚本中使用expect实现scp传输问题

    1.安装expect expect用于shell脚本中自动交互,其是基于tcl编程语言的工具.所以安装expect首先安装tcl.本文中使用的是expect5.45和tcl8.6.6. 安装tcl [ ...

  2. linux shell脚本中使用expect(脚本打开新终端自动远程连接顺便输一点指令)(巨坑)

    放弃吧 我找了六个小时都没找到可以用的方案(指标题括号里的内容) 给个曲线救国的方法: 现把expect脚本写成一个文件 在另一个shell脚本中调用

  3. [转帖]Shell脚本中的break continue exit return

    Shell脚本中的break continue exit return 转自:http://www.cnblogs.com/guosj/p/4571239.html break结束并退出循环 cont ...

  4. 利用 tee 命令调试shell脚本中的管道

    在编写shell脚本时,调试是个比较麻烦的事,特别是涉及到多层管道命令的时候,会产生多个中间结果,tee命令的作用是从标准输入中读取数据写入标准输出或文件中,利用它可以从管道中读取中间结果并写入本地临 ...

  5. 在shell脚本中进行条件控制以及使用循环

    转载请标明:http://www.cnblogs.com/winifred-tang94/ if条件语句语法: if [ 条件表达式 ] then 代码 else 代码 fi 注意:在上面的if条件语 ...

  6. ftp在shell脚本中的使用方法

    1. ftp自动登录批量下载文件. #####从ftp服务器上的/home/data 到 本地的/home/databackup#####!/bin/bashftp -n<<!open 1 ...

  7. centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课

    centos  shell脚本编程2 if 判断  case判断   shell脚本中的循环  for   while   shell中的函数  break  continue  test 命令   ...

  8. shell脚本中的各种表达式介绍和使用

    #前言:在shell脚本中,有各种的表达式,包括有条件测试表达式,文件表达式,字符串表达式,整数表达式,接下来我们来了解一下他们的使用方法 1.条件测试表达式 #首先来看一下条件测试语法 #条件测试语 ...

  9. shell脚本中 /dev/null 的用途

    /dev/null 是一个特殊的设备文件,它丢弃一切写入其中的数据 可以将它 视为一个黑洞, 它等效于只写文件, 写入其中的所有内容都会消失, 尝试从中读取或输出不会有任何结果,同样,/dev/nul ...

  10. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

随机推荐

  1. 自签证书https

    1.下载编译好的openssl. http://slproweb.com/products/Win32OpenSSL.html 下载完成后运行安装: 记住你安装到的目录,等下打开这个文件夹(小贴士:最 ...

  2. 【华为云技术分享】解密如何使用昇腾AI计算解决方案构建业务引擎

    摘要:昇腾AI计算解决方案以极致算力,端边云融合.全栈创新,开放生态的硬核实力.用户可以使用标准的Matrix接口实现业务引擎,对外释放昇腾AI加速能力. 从卷积神经网络中的矩阵乘法(GEMM)说起 ...

  3. Serverless遇到 FinOps: Economical Serverless

    摘要:本文基于FunctionGraph在Serverless 领域的FinOps探索和实践,提出业界首个Serverless函数总成本估计模型 历川:华为云Serverless研发专家 平山:华为云 ...

  4. 华为云云原生数据库GaussDB加速创新,企业核心数据上云信赖之选

    集大会演讲.圆桌讨论.精彩活动及现场直击....一大波华为开发者大会2021干货资料来喽~~!还等什么快快来领取技术福利! 摘要:华为开发者大会(Cloud)上,华为云发布了云原生数据库GaussDB ...

  5. vue2升级vue3:provide与inject 使用注意事项

    provide / inject 类似于消息的订阅和发布.provide 提供或发送数据, inject 接收数据. VUE provide 和 inject 使用场景 当我们需要从父组件向子组件传递 ...

  6. 火山引擎 ByteHouse:双十一即将到来,如何用数据分析提升电商平台销售转化?

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 "双十一"电商大促脚步渐近,各大平台的战火又将燃起.直播电商以低成本.高转化率等优势备受商家青 ...

  7. PPT 模仿力,看到好的设计随意为我所用

    PPT 模仿力,看到好的设计随意为我所用 网上搜索一些作品 Q1: 这一页的设计亮点在哪? Q2: 我能不能用在PPT里面? Q3: 我能不能用PPT模仿出来? 举例 思源黑体

  8. Jenkins + SVN

    安装插件 Localization: Chinese (Simplified) Subversion 配置国内源 http://mirror.tuna.tsinghua.edu.cn/jenkins/ ...

  9. Java线程池使用浅谈

    1. 线程池相关基本概念 任务(Task):任务是线程池中要执行的工作单元.任务可以是实现了 Runnable 接口或 Callable 接口的对象.Runnable 任务没有返回值,而 Callab ...

  10. RocketMQ事务消息在订单创建和库存扣减的使用

    前言 下单的过程包括订单创建,还有库存的扣减,为提高系统的性能,将库存放在redis扣减,则会涉及到Mysql和redis之间的数据同步,其中,这个过程还涉及到,必须是订单创建成功才进行库存的扣减操作 ...