[转帖]Shell脚本中利用expect实现非交互式

shell,脚本,利用,expect,实现,交互式 · 浏览次数 : 0

小编点评

**expect非交互式简介** expect是一个自动化交互套件,用于执行命令和程序时,系统以交互形式要求输入指定字符串。 **主要应用场景** * 远程登录 * 执行命令和程序 * 实现交互通信 **实现步骤** 1. **启动指定进程**(使用`spawn`命令) 2. **获取指定关键字**(使用`expect`中内部命令) 3. **发送指定字符**(使用`send`命令) 4. **执行完成退出**(使用`exp_continue`标记) **示例** ```python # 远程登录 spawn("ssh root@192.168.81.210") # 获取匹配信息 match_result = expect("*yes/no*") # 输入 "yes" expect("*yes/no*") # 输入密码 expect("password:") password = "redhat" send(password) # 执行完成退出 expect("finish........") ``` **其他** * `interact`命令是`expect`中的内部命令,与`shell`中的`read`和`write`命令相似,但不是一个独立的命令。 * `expect`可以使用`send_user`和`expect_continue`等命令控制交互流程。 * `expect`可以通过`timeout`设置时间等待匹配信息或程序完成。

正文

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实现非交互式相似的内容:

[转帖]Shell脚本中利用expect实现非交互式

https://developer.aliyun.com/article/885723?spm=a2c6h.24874632.expert-profile.295.7c46cfe9h5DxWK 简介: expect非交互式 expect可以在脚本中完成一些交互式的操作,例如远程登录时要输入yes或者

[转帖]shell脚本循环查询数据库实现数据输出到csv

https://blog.csdn.net/m0_46897923/article/details/125906115?spm=1001.2014.3001.5501 可以利用这个思路高点事情吧.. 一、shell脚本和数据文件 1.shell脚本 cat data.txt|while read l

[转帖]Shell 脚本中经典的13个面试题

经典的Shell十三问 1. 为何叫做shell?2. Shell prompt(PS1)与Carriage Return(CR)的关系?3. 别人echo, 你也echo, 是问echo知多少?4. ""(双引号)与(单引号)有什么区别?5. var=value? export前后差在哪?6. e

[转帖]shell脚本中$0 $1 $# $@ $* $? $ 的各种符号的意义

概述 shell中有两类字符,一类是普通字符,在Shell中除了本身的字面意思外没有其他特殊意义,即普通纯文本;另一类即元字符,是Shell的保留字符,在Shell中有着特殊的含义。 今天主要介绍一下shell中字符$的各种用法。 转义字符$ 在linux shell脚本中经常用到字符 ,下面是 ,

[转帖]shell脚本中$0 $1 $# $@ $* $? $ 的各种符号的意义

概述 shell中有两类字符,一类是普通字符,在Shell中除了本身的字面意思外没有其他特殊意义,即普通纯文本;另一类即元字符,是Shell的保留字符,在Shell中有着特殊的含义。 今天主要介绍一下shell中字符$的各种用法。 转义字符$ 在linux shell脚本中经常用到字符 ,下面是 ,

[转帖]Linux Shell:date日期时间操作

https://www.jianshu.com/p/cc9ebb212a8e 整理Linux Shell脚本中常用的日期操作,给予date命令,主要用法总结 获得当前日期,时间戳,date,date '+%s' 日期解析(字符串转日期,时间戳转日期)date -d 日期格式化输出,date '+%'

[转帖]Linux平台shell脚本输入密码,不显示明文

需求:shell脚本中输入密码,要求不显示明文,需要将其转换为“*”星号,或者不显示 实现方案:有两种实现方案,一是通过stty命令来实现,二是直接使用read来实现 方案一:使用stty来实现 使用stty -echo可以实现不显示密码,就像登录Linux系统输入密码时一样,stty的代码如下:

[转帖]如何通过shell脚本对一个文件中的所有数值相加并求和

https://developer.aliyun.com/article/886170?spm=a2c6h.24874632.expert-profile.255.7c46cfe9h5DxWK 1.背景 在一些巡检脚本中有时通常需要把一个文件中的数值进行相加得出综合,由于是文件中的所有数值,因此不能

[转帖]Linux中最全shell命令&常用注意事项

在编辑linux脚本中不断的会用到复杂的脚本编辑,写文章记录。 Linux命令大全(手册) – 真正好用的Linux命令在线查询网站 目录 推荐书籍: Linux常用命令 Linux 常用命令 在linux shell脚本中root切换到普通用户执行脚本 Linux—shell中$(( ))、$(

[转帖]shell脚本变量详解(自定义变量、环境变量、变量赋值、变量运算、变量内容替换)

https://developer.aliyun.com/article/885658 简介: shell变量 shell变量是指用一个特定的字符串去表示不固定的内容 1.变量的类型 1.1自定义变量 一般情况下不怎么使用环境变量,如果需要在其他文件中引入某个文件的变量则在脚本最开始的位置使用sou