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

相关推荐

  • Centos7删除多余的内核

    Linux下可能会存在有多个内核的情况,通过某一内核启动会出现无法登录的情况,这时我们就要选择可以正常登录的内核,成功进入系统后,将多余的内核删除 检查系统中的内核 使用yum remove 或rpm -e 删除无用内核

    2022年6月25日
    1.4K00
  • rsync的搭建与使用

    rsync是数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。 已支持跨平台,可以在Windows与Linux间进行数据同步。 Ubuntu安装 Centos安装 基本用法 rsync语法有三种,分别是本地到本地形式Local to Local,本地到远程Local to Remot…

    2022年11月19日
    1.3K00
  • 通过配置hosts.allow和hosts.deny限制登陆

    我们通常只对管理员开放SSH登录,那我们就可以禁用不必要的IP,而只开放管理员可能使用到的IP段。 /etc/hosts.allow和/etc/hosts.deny两个文件是控制远程访问设置的,通过他可以允许或者拒绝某个ip或者ip段的客户访问linux的某项服务。 我们通常只对管理员开放SSH登录,那我们就可以禁用不必要的IP,而只开放管理员可能使用到的I…

    2022年11月15日
    1.8K00
  • 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.2K00
  • MySQL 用户管理和权限管理

    在项目中,一个数据库有很多人需要使用,不能所有的人都使用相同的权限,如果人比较多,一人一个用户也很难管理。一般来说,会分超级管理员权限,管理员权限,读写权限,只读权限等,这样方便管理。当然,具体怎么管理权限根据实际情况来确定。无论如何,都需要创建多个用户来管理权限。root 是数据库的超级管理员用户,对于普通开发人员来说,权限太大了,如果不小心做了一些不可逆…

    2022年6月9日
    1.5K00

发表回复

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

在线咨询: QQ交谈

邮件:712342017@qq.com

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

关注微信