Expect解决shell脚本的交互需求

在linux系统中,shell脚本可以大大提高我们的工作效率。但遇到需要交互的场景时,shell脚本却无法解决。

简介

Expect语言是基于Tcl的。Tcl实际上是一个子程序库,这些子程序库可以嵌入到程序里从而提供语言服务。 最终的语言有点象一个典型的 Shell语言。里面有给变量赋值的set命令,控制程序执行的if,for,continue等命令,还能进行普通的数学和字符串操作。当然了,还可以 用exec来调用Unix程序。所有这些功能,Tcl都有。

综述

Expect是在Tcl基础上创建起来的,它还提供了一些Tcl所没有的命令:

1.spawn命令激活一个Unix程序来进行交互式的运行。

2.send命令向进程发送字符串。

3.expect命令等待进程的某些字符串。expect支持正规表达式并能同时等待多个字符串,并对每一个字符串执行不同的操作。expect还能理解一些特殊情况,如超时和遇到文件尾。

4.expect命令和Tcl的case命令的风格很相似。都是用一个字符串去匹配多个字符串。(只要有可能,新的命令总是和已有的Tcl命令相似,以使得该语言保持工具族的继承性)。

示例:

yum -y install expect tcl tclx tcl-devel

通过expect解决ssh交互的问题

#!/usr/bin/expect
set timeout 10                 #设置超时等待时间
spawn ssh root@192.168.50.122  #使用spawn 执行unix程序开始交互
expect {                       #交互内容
"yes/no" { send "yes\r";exp_continue  }   #"yes/no"关键字匹配,"exp_continue"表示如果没有匹配到该项,则跳过。
"password:" { send "666666\r" };         #"password:"关键字匹配
}
interact                       #停留在交互界面

使用expect进行批量公钥推送

touch /ssh-copy-id.expect

#!/usr/bin/expect
set timeout 10
spawn ssh-copy-id ${ip}
expect {
"yes/no" { send "yes\r";exp_continue  }
"password:" { send "666666\r" };
}
#!/bin/bash
>ip.txt ##清空记录文本
for i in {1..255}
	do
{
    ip=192.168.1.${i}
  	ping -c1 -W1 ${ip} &> /dev/null
    if [ ${?} -eq 0 ] ; then
    	echo "${ip}" | tee -a ip.txt
    	/usr/bin/expect /ssh-copy-id.expect
    fi
} &  ##后台执行
done
wait
echo "ping finish..."

文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/6080

(0)
李逍遥的头像李逍遥
上一篇 2022年11月14日 下午9:08
下一篇 2022年11月15日 上午11:32

相关推荐

  • Windows server 2019安装.Net Framework 3.5的教程

    信息如下: 解决方法: 其他方法 如果你没有WSUS服务器的话可以通过这个方法来试试使用dism.exe 下载系统镜像里的原始文件 这里我放在了百度云盘里面,下载地址见: 安装教程 1.将下载的文件解压到D盘sxs文件夹,如下图所示: 注意路劲是: 该文件夹下面是有4个文件的。 2.进入CMD

    2024年3月8日
    1.4K00
  • Key exchange was not finished, connection is closed.解决办法

    利用java连接Linux服务器中碰到错误:Key exchange was not finished, connection is closed.,导致服务器的连接失败,报错如下 原因 是ssh中的key交换算法不兼容导致 解决办法 修改配置文件 添加如下内容 重启服务

    2023年7月25日
    1.6K00
  • diff命令比较两个文件的不同

    [语法]: diff [参数] 文件1 文件2-b 将一串空格或TAB 转换成一个空格或TAB-e 生成一个编辑角本,作为ex 或ed 的输入可将文件1 转换成文件2[例子]:diff file1 file2diff -b file1 file2diff -e file1 file2 >edscriptdiff 命令的常用参数参数 说明a 将所有文件当…

    2023年11月29日
    92300
  • HTTPS 下使用WebSocket的一些实践

    问题描述: HTTPS 下发起WS连接,连接失败,Chrom 浏览器报错。 socket.js:19 Mixed Content: The page at ‘https://app.XXX.com’ was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoi…

    2023年1月20日
    1.1K00
  • Docker常用命令

    列出所有容器ID 查看所有运行或者不运行容器 停止所有的container(容器),这样才能够删除其中的images: 如果想要删除所有container(容器)的话再加一个指令: 查看当前有些什么images 删除images(镜像),通过image的id来指定删除谁 想要删除untagged images,也就是那些id为的image的话可以用 要删除全…

    2022年11月19日
    1.1K00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信