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

相关推荐

  • CentOS 7 磁盘挂载教程

    mount命令是经常会使用到的命令,它用于挂载Linux系统外的文件 进行挂载操作后,用户便可以在挂载目录中使用硬盘资源了。默认情况下Linux系统并不会像Windows系统那样自动的挂载光盘和U盘设备,需要自行完成。 语法 语法格式:mount [参数] [设备] [挂载点] 常用参数 -t 指定文件系统,即挂载类型 -l 显示已加载的文件系统列表 -h …

    2022年6月9日
    3.1K10
  • CentOS 使用speedtest命令行测试网速

    安装speedtest-cli speedtest-cli是一个用Python编写的轻量级Linux命令行工具,在Python2.4至3.4版本下均可运行。它基于Speedtest.net的基础架构来测量网络的上/下行速率。安装speedtest-cli很简单——只需要下载其Python脚本文件。 使用speedtest-cli测试网速 输入这个命令后,它会…

    2022年6月28日
    1.2K00
  • windows操作系统,怎么将远程服务器共享的文件夹映射到本地?

    将远程服务器上的一个文件夹作为共享文件夹,通过ip访问共享文件夹。那么可不可以将这个远程共享的文件夹映射到Windows系统作为一个本地盘符呢?答案是可以的。具体操作如下: 下面是在Windows中创建一个映射动器的步骤 1.打开资源管理器,选择“此电脑”或”计算机”选项 2.点击菜单栏中的“映射网络驱动器”选项 如下图: 3.在弹出的对话框中,选择要映射的…

    2024年5月10日
    1.5K00
  • 在 Kubernetes 上最小化安装 KubeSphere

    除了在 Linux 机器上安装 KubeSphere 之外,您还可以将其直接部署在现有的 Kubernetes 集群上。本快速入门指南将引导您完成在 Kubernetes 上最小化安装 KubeSphere 的一般性步骤。 准备工作 备注 部署 KubeSphere 确保您的机器满足安装的前提条件之后,可以按照以下步骤安装 KubeSphere。 执行以下命…

    2023年4月18日
    1.1K00
  • windows10电脑开机错误提示0xc00000bb

    Windows10系统设备卡在主板logo提示B1InitializeLibrary failed 0xc00000bb的解决方法; 开机提示B1InitializeLibrary failed 0xc00000bb报错,是由于GUID主分区表损坏,无法正常读取UEFI启动项导致。 解决办法很简单,通过启动U盘进入WINPE系统,打开Diskgenius分区…

    2023年9月21日
    1.4K00

发表回复

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

在线咨询: QQ交谈

邮件:712342017@qq.com

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

关注微信