【免交互】

news2024/11/27 4:28:28

目录

  • 一、免交互
    • 1.1、语法格式
    • 1.2、命令演示
      • 1、多行写入文件内容
      • 2、多行注释
  • 二、Expect
    • 2.1、基本命令
    • 2.2、脚本操作


一、免交互

1、使用I/O重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。
2、是标准输入的一种替代品可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个“文件”并用作“命令”的标准输入。Here Document 也可以与非交互式程序和命令一起使用。

1.1、语法格式

命令  <<标记

内容		
	
标记 
#(前面后后面不能加如别的字符,只能跟第一个标记一样)

注意事项:
1、标记可以使用任意合法字符(通常为EOF)
2、结尾的标记一定要顶格写,前面不能有任何字符
3、结尾的标记后面也不能有任何字符(包括空格)
4、开头标记前后的空格会被省略掉

1.2、命令演示

1、免交互方式实现对行数的统计,将要统计的内容置于标记“EOF”之间,直接将内容传给 wc -l 来统计

[root@dz666 ~]# wc -l <<EOF
> abc
> 123
> 456
> 789
> EOF
4

2、通过 read 命令接收输入并打印,输入值是两个 EOF 标记之间的部分,作为变量 i 的值

[root@dz666 ~]# read i <<EOF
> hellow
> you
> EOF

[root@dz666 ~]# echo $i
#使用read命令时,只能显示第一个值
hellow

3、通过 passwd 给用户设置密码

[root@dz666 ~]# passwd lisi <<EOF
> abc123      
> abc123 
#这两行是修改用户密码时要输入的密码和确认密码
> EOF

1、多行写入文件内容

4、EOF 支持变量替换
在写入文件时会先将变量替换成实际值,再结合 cat 命令完成写入

#!/bin/bash

file="abc.txt"
i="school"
cat >$file <<EOF
I am go to $i
EOF

cat abc.txt

在这里插入图片描述
5、整体赋值给变量,然后通过 echo 命令将变量值打印出来

#!/bin/bash

i="school"
a=$(cat <<EOF
hello girl
I like you
I am go to $i
EOF
)

echo "$a"
#加上双引号保留换行符

在这里插入图片描述

6、关闭变量替换的功能,按照字符原本的样子输出,不做任何修改或替换

#!/bin/bash

i="school"
a=$(cat <<'EOF'   #加上单引号关闭变量替换
hello girl
I like you
I am go to $i
EOF
)

echo "$a"
#加上双引号保留换行符

在这里插入图片描述

7、去掉每行之前的 TAB 字符,只能抑制制表符,不能抑制空格

#!/bin/bash

i="school" 
a=$(cat <<-EOF    #在标记前加“-”,即可抑制各行首TAB	
        hello girl
                I like you
                        I am go to $i
EOF
)

echo "$a"

2、多行注释

“:”代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash 忽略掉,因此可达到批量注释的效果。

: <<EOF   #使用 :来进行注释操作
i="school"
EOF

a=$(cat <<-EOF
hello girl
I like you
I am go to $i
EOF
)

echo "$a"

请添加图片描述

请添加图片描述

二、Expect

建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互相关的问题。

使用 yum install -y expect
安装软件

2.1、基本命令

1、脚本解释器
expect 脚本中首先引入文件,表明使用的是哪一个 shell脚本环境。

#!/usr/bin/expect

2、spawn
spawn 后面通常跟一个Linux执行命令,表示开启一个会话、启动进程,并跟踪后续交互信息。

:spawn passwd root

3、expect
判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;
只能捕捉由spawn启动的进程的输出;
用于接收命令执行后的输出,然后和期望的字符串匹配

4、send
向进程发送字符串,用于模拟用户的输入;该命令不能自动回车换行,一般要加\r(回车)或者\n

例:
方式一:
expect "密码" {send "abc123\r"}		#同一行send部分要有{}
方式二:
expect "密码"	
send "abc123\r"							#换行send部分不需要有{}
方式三:
expect支持多个分支

expect					#只要匹配了其中一个情况,执行相应的send语句后退出该expect语句
{
"密码1" {send "abc123\r"}
"密码2" {send "123456\r"}
"密码3" {send "123123\r"}
}

5、结束符

expect eof
退出免交互进程,并返回值交互前状态
当执行完命令后,默认停留10s后,自动切回了原用户
interact
退出免交互进程,并保持当前状态

注意:expect eof 与 interact 只能二选一。

6、set
expect 默认的超时时间是 10 秒,通过 set 命令可以设置会话超时时间, 若不限制超时时间则应设置为-1。

例:set timeout 30
set timeout -1 #永不超时

7、exp_continue (并行匹配)
exp_continue 附加于某个 expect 判断项之后,可以使该项被匹配后,还能继续匹配该 expect 判断语句内的其他项。exp_continue 类似于控制语句中的 continue 语句。表示允许 expect 继续向下执行指令。

例如:下例将判断交互输出中是否存在 yes/no 或 *password。如果匹配 yes/no 则输出 yes 并再次执行判断;如果匹配 *password 则输出 abc123 并结束该段 expect 语句。

expect {
    "(yes/no)" {send "yes\r"; exp_continue;}
    #exp_continue 终止本次后续匹配操作
    "*password" {set timeout 5; send "abc123\r";}
}

注意:使用exp_continue时,如果跟踪像 passwd 这样的输入密码后就结束进程的命令,expect{}外不要再加上expect eof
因为spawn进程结束后会默认向expect发送eof,会导致后面的 expect eof 执行报错

8、send_user
send_user 表示回显命令,输出需要的内容,相当于 echo

9、接收参数
expect 脚本可以接受从bash命令行传递的参数,使用[lindex $argv n]获得。其中n从0开始,分别表示第一个,第二个,第三个…参数。

例:
set hostname [lindex $argv 0]   	相当于 hostname=$1
set password [lindex $argv 1]		相当于 password=$2

2.2、脚本操作

1、免交互用户输入密码

#!/usr/bin/expect

#设置变量
set user "lisi"
set passd "123123"

#开启免交互追踪进程
spawn su $user

#匹配系统输出和设置的字符串是否满足条件,如果匹配则发送send后的字符串给被追踪的命令
expect "密码:" {send "$passd\r"}


expect  "lisi"
#在屏幕输出指定字符串
send_user "ok"

#退出免交互进程,并保持当前状态
#interact


#退出免交互进程,并返回值交互前状态
expect eof

2、嵌入执行模式,将 expect 过程融入 Shell 当中,方便执行和处理。像ssh、su这种会切换环境的交互式命令一般不建议使用嵌入执行模式。
创建用户并设置密码

#!/bin/bash
user=$1
read -p "请输入$user的密码:" password

useradd $user


#在bash环境中嵌入expect,expect嵌入模式不建议作ssh,su这种会保持状态的交互操作
/usr/bin/expect <<EOF
spawn passwd $user

#输入第一次密码
expect "新的*"
send "${password}\r"

#输入第二次密码
expect "重新输入*"
send "${password}\r"
expect eof  #退出免交互进程,并返回值交互前状态
EOF

在这里插入图片描述

3、实现免交互连接对应主机

#!/usr/bin/expect

#设置超时时间            
set timeout 5

#设置传入参数            
set remote_host [lindex $argv 0]
set password [lindex $argv 1] 

#开启跟踪              
spawn ssh $remote_host

#匹配系统输出
expect {
  "Connection refused" {send_user "ssh访问被拒绝\n"}
  "No route to host" {send_user "对方主机不存在\n"}
  "(yes/no)" {send "yes\n"; exp_continue}
  "*password:" {send "${password}\n"}

}

interact
在脚本文件后面输入对应的IP地址和对应主机的密码

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/533640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL

目录 1. 泛型编程 1.1 函数重载弊端 1.2 泛型编程概念 2. 函数模板 2.1 函数模板的概念 2.2 函数模板格式 2.3 函数模板原理 2.4 函数模板实例化 2.4.1 隐式实例化 2.4.2 显式实例化 2.5 模板参数的匹配原则 3. 类模板 3.1 类模板的定义 3.2 类模板实例化 4.…

David Silver Lecture 7: Policy Gradient

1 Introduction 1.1 Policy-Based Reinforcement Learning 1.2 Value-based and policy based RL 基于值的强化学习 在基于值的 RL 中&#xff0c;目标是找到一个最优的值函数&#xff0c;通常是 Q 函数或 V 函数。这些函数为给定的状态或状态-动作对分配一个值&#xff0c;表…

【JAVAEE】JUC(java.util.concurrent)的常见类

目录 1.Callable接口 1.1简介 1.2代码演示 1.3Runnable与Callable的区别 2.ReentrantLock 2.1ReentrantLock的常用方法 2.2ReentrantLock的代码演示 2.3ReentrantLock和synchronized的区别 3.Semaphore信号量 3.1概念 3.2代码演示 4.CountDownLatch 4.1概念 4.2代…

【SpringBoot整合RabbitMQ(下)】

八、死信队列 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;字面意思可以这样理解&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或者直接到 queue 里了&#xff0c; consumer 从 queue 取出消…

用Pin自动对二进制文件脱壳

Intel Pin Intel Pin在可执行二进制代码中插入一些探测函数,用于观察、记录、分析宿主代码执行过程中的一些与计算机体系结构相关的特性,如访存指令,寄存器内容,寄存器地址等,通过Pin提供的API可以编写各种分析函数,这样程序运行完以后,统计和分析结果也同时产生,分析…

I3D--视频理解必读论文总结

论文标题&#xff1a;Quo Vadis, Action Recognition? A New Model and the Kinetics会议期刊&#xff1a; CVPR 2017Dataset 论文地址&#xff1a;https://arxiv.org/pdf/1705.07750.pdf 文章目录 前言文章核心摘要引入方法a. 2DConvLSTMb. 3DConvc d. Two-StrwamTwo-Stream …

C语言学习分享(第七次)------操作符

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C语言学习分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C语言知识   &#x1f51d;&#x1f51d; 操作符详解 1. 前言&#x1f6a9;2…

Ajax,前后端分离开发,前端工程化,Element,Vue路由,打包部署

Ajax介绍 Axios <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wid…

为什么我掌握了大量软测知识,却还是找不到工作?

很多朋友都在疑惑&#xff0c;为什么随着对于软件测试了解的加深&#xff0c;不断掌握更多测试知识与技巧&#xff0c;找工作貌似越来越难了&#xff1f; 不免让人联想到最近偶然间看到一句话&#xff1a;“软件测试是整个 IT 行业中最差的岗位”。 打工人的问题出在哪&#xf…

使用Jmeter应该如何进行http接口性能测试?

在进行网页或应用程序后台接口开发时&#xff0c;一般要及时测试开发的接口能否正确接收和返回数据&#xff0c;对于单次测试&#xff0c;Postman插件是个不错的Http请求模拟工具。 但是Postman只能模拟单客户端的单次请求&#xff0c;而对于模拟多用户并发等性能测试&#xff…

11.1网络编程——

多线程 一、基础知识概念相关API二、任务创建一个简单的本地客户端创建一个简单的本地服务器三、总结四、问题一、基础知识 概念 网络编程中客户端和服务器指的是进程,而不是常提到的机器或者主机。注意三个概念:请求、响应、事务。 网络编程中客户端-服务器事务是指客户端和…

刷题day65:分割等和子集

题意描述&#xff1a; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 思路&#xff1a; 使用01背包&#xff0c; 背包的体积为sum / 2背包要放入的商品&#xff08;集合里的元素&#xff09;…

linux数据校验

文件 一般对于文件的校验使用md5&#xff0c;centos7系统有自带的md5校验工具md5sum&#xff0c;可以用来校验两个文件是否一致 可以对比一下md5值是否一致来校验文件是否一致 目录 1 若是在主机上使用网络磁盘挂载备份的可以使用diff工具对比两个目录是否一致 diff -r /op…

Nginx使用教程

目录 一、Nginx介绍二、下载和安装三、Nginx命令1.查看版本2.检查配置文件正确性3.启动和停止4.重新加载配置文件 四、配置文件结构五、Nginx具体应用1.部署静态资源2.反向代理3.负载均衡 一、Nginx介绍 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件( IMAP/POP3)代…

少儿编程 中国电子学会图形化编程等级考试Scratch编程二级真题解析(选择题)2023年3月

2023年3月scratch编程等级考试二级真题 选择题(共25题,每题2分,共50分) 1、小猫的程序如图所示,积木块的颜色与球的颜色一致。点击绿旗执行程序后,下列说法正确的是 A、小猫一直在左右移动,嘴里一直说着“抓到了”。 B、小猫会碰到球,然后停止。 C、小猫一直在左右…

《LKD3粗读笔记》(13)虚拟文件系统

《LKD3粗读笔记》(13)虚拟文件系统 虚拟文件系统&#xff0c;简称VFS&#xff0c;是内核的子系统&#xff0c;为用户空间程序提供了文件系统相关的接口。系统中所有文件系统不但依赖VFS共存&#xff0c;而且也依靠VFS系统协同工作。通过虚拟文件系统&#xff0c;程序可以利用标…

文本三剑客正则表达式2

文章目录 文本三剑客&正则表达式21 sed2 sed命令的常用选项3 sed命令的操作符4 打印4.1 按照行号寻址打印4.1.1 只打印第二行4.1.2 只显示行号4.1.3 显示行号及内容4.1.4 只打印最后一行 4.2 进行行号范围区间的打印4.2.1 打印1-3行4.2.2 打印第二行到最后一行4.2.3 打印2-…

操作符续(整型提升与算术转换)

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C知识系统分享》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c…

MySQL深入浅出: order by if()与order by in()之条件排序

目录 1&#xff1a;原表数据 2&#xff1a;order by if&#xff08;&#xff09; 3&#xff1a;order by in&#xff08;&#xff09; 4&#xff1a;社区地址 1&#xff1a;原表数据 2&#xff1a;order by if&#xff08;&#xff09; SELECT * FROM people ORDER BY IF(…

mysql数据库的表的增删查改

目录 表的增删查改 6.1&#xff1a;增加 6.2&#xff1a;查找 6.3&#xff1a;更新 6.4&#xff1a;删除 6.5&#xff1a; 插入查询结果 6.6&#xff1a;聚合函数 6.7&#xff1a;group by分组 关键字的先后顺序&#xff1a;from > on> join > where > gro…