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

相关推荐

  • linux查看某个文件夹的大小(ls命令、du命令详解)

    ls 命令:列出当前工作目录下的所有文件/文件夹的名称 使用ls -l,会显示成字节大小,ls- lh会以KB、MB等为单位进行显示更加直观。 du 命令:查看当前目录和子目录文件夹/文件大小情况 du = disk usage 磁盘使用率,输出每个文件或者目录总大小,其用法如下: du -sh:查看当前目录总大小。 du -sh *:查看当前目录所有子目录…

    2024年5月13日
    2.1K00
  • 如何自动备份文件到群晖NAS

    如何将电脑、服务器上的文件自动备份到群晖NAS? 方法有很多,今天给大家介绍两种最简单的方法: 方法1:Windows内置工具自动备份文件到群晖NAS 以下是使用Windows内置工具“备份和还原”,实现自动备份文件到群晖NAS的操作步骤。 步骤1. 打开控制面板,然后点击“备份和还原(Windows 7)”,然后点击右侧的“设置备份” 步骤2. 在设置备份…

    2024年5月30日
    1.5K00
  • Docker常用命令

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

    2022年11月19日
    1.6K00
  • ubuntu修改默认文件权限umask

    在Ubuntu中,umask是一个内置的shell命令,用于确定新创建文件和目录的默认权限。umask值是一个三位或四位的八进制数。这个值被从全权限(即777)中减去,以得到新文件或目录的默认权限。 要临时修改umask值,你可以在命令行中直接输入umask命令,后面跟上你想要的值。例如,要将umask设置为022(这将使新文件的默认权限为755,新目录的默…

    2023年10月16日
    2.0K00
  • Linux 命令神器:lsof

    lsof是系统管理/安全的尤伯工具。将这个工具称之为lsof真实名副其实,因为它是指“列出打开文件(lists openfiles)”。而有一点要切记,在Unix中一切(包括网络套接口)都是文件。 有趣的是,lsof也是有着最多开关的Linux/Unix命令之一。它有那么多的开关,它有许多选项支持使用-和+前缀。 正如你所见,lsof有着实在是令人惊讶的选项…

    2023年3月13日
    1.6K00

发表回复

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

在线咨询: QQ交谈

邮件:712342017@qq.com

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

关注微信