当前位置: 首页 > article >正文

免 交 互

免交互
Here Document 的作用:
使用I/O重定向的方式将命令列表提供给交互式程序;
标准输入的一种替代品。

标记可以使用任意合法字符,但开始标记与结尾标记需要保持一致。(常用标记EOF,使用其他字母也可以)
结尾的标记一定要顶格写,前面不能有任何字符。
结尾的标记后面也不能有任何字符(包括空行)。
开头标记前后的空格会被省略掉。

read只能读取一行内容,只要遇到换行符就算一行结束,read就终止
统计输入的行数
开头和结尾的标记,一定要保持一致。
wc -l <<EOF    //标记是EOF
 > 111
 > 222
 > 333
 > EOF

免交互修改用户密码
passwd nancy <<EOF
 > abc123
 > abc123
 > EOF

cat命令+免交互
使用cat命令+免交换的方式,重定向输出到文件
cat <<EOF > hello.txt   //将内容重定向输出到文件中
 > hello world
 > today is a good day
 > EOF

tee命令(同时实现 标准输出+重定向输出)
tee h2.txt <<EOF
 > hello
 > world
 > EOF
 hello
 world

Here Document 变量的使用
如果标记之间有变量被使用,会先替换变量值。如果想要将一些内容写入文件,除了常规的方法外,也可以使用 Here Document。
如果写入的内容中包含变量,在写入文件时要先将变量替换成实际值,再结合cat命令完成输出。
涉及到换行时,输出变量要加双引号
var="I am going to school!"
 ​
 myvar=$(cat <<EOF
 hello world
 today is good day
 $var
 EOF
 )
 #涉及到换行时,输出变量要加双引号
 echo "$myvar"

输入的内容不进行变量的替换
多行注释
使用冒号为开头的Here Document,是多行注释。输入的内容不会被执行。(一般直接使用#进行注释)
忽略行首TAB键
<< 和 - 之间不能有空格
#开始标记加上 - 后,会忽略每行行首的tab键。<< 和 - 之间不能有空格。
 myvar=$(cat <<-'EOF'
     hello world
         today is good day
     $var
 EOF
 )
 #涉及到换行时,输出变量要加双引号
 echo "$myvar"

Expect是建立在 tcl 语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互相关的问题。
需要安装两个软件包:expect,tcl
 rpm -q expect
 rpm -q tcl 
 yum install -y expect   #安装expect(tcl软件包会作为依赖被安装)


Expect基本命令
脚本解释器
expect 脚本中首先引入文件,表明使用的是哪一个 shell
#!/usr/bin/expect
spawn 启动进程并捕捉交互信息
spawn 后面通常跟一个 Linux 执行命令,表示开启一个会话、启动进程,并跟踪后续交互信息。
例如:spawn passwd root
expect 从进程接收字符串
判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;
只能捕捉由 spawn 启动的进程的输出;
用于接收命令执行后的输出,然后和期望的字符串匹配
send 用于向进程发送字符串
向进程发送字符串,用于模拟用户的输入;
该命令不能自动回车换行,一般要加\r (回车)或者\n

结束符(expect eof 与 interact 只能二选一)
expect eof
表示交互结束,等待执行结束,退回到原用户,与spawn对应。
比如切换到root用户,expect脚本默认的是等待10s当执行完命令后,默认停留10s后,自动切回了原用户
interact
执行完后保持交互状态,把控制权交给控制台会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命令不起作用;
例如:interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。
使用interact会保持在终端而不会退回到原终端;
例如:切换到root用户,会一直在root用户状态下;比如ssh到另外一台服务器,会一直在目标服务器终端,而不会切换到原来服务器
expect eof 与interact只能二选一

send_users
表示回显命令,相当于echo

接收参数
expect 脚本可以接受从bash命令行传递参数,使用 [lindex $argv n]获得。其中你从0开始,分别表示第一个,第二个,第三个.....参数
passwd修改用户密码
#!/usr/bin/expect
 #设置expect等待的超时时间,默认是10s 
 set timeout 5
 #先用spawn开启对一个有交互过程命令进程的跟踪
 spawn passwd hele
 #用expect捕捉系统的交互提示信息。第一次匹配
 expect "新的 密码"
 #当expect匹配成功则会模拟用户发送字符串给交互进程,字符串结尾记得加\r或者\n
 send "abc1234\r"      
 #第二次匹配
 expect "重新输入新的 密码" {send "abc1234\r"}
 expect eof 


su命令切换用户
set timeout 5
set username [lindex $argv 0]
 set password [lindex $argv 1]
spawn su $username
 ​
 #免交互执行,用expect匹配系统提示信息,再用send模拟用户发送内容
 expect "密码:"
 send "$password\r"
 expect "*]#"
 #send_user表示回显命令,相当于echo
 send_user "sucessfully"
#免交互结束后把控制权交给用户,并不会退回原用户
 #interact
 #免交互结束后会在超时等待时间过后退回原用户
 expect eof


 


http://www.kler.cn/a/6050.html

相关文章:

  • 机器学习免费使用的数据集及网站链接
  • vue3运行时执行过程步骤
  • springboot + vue+elementUI图片上传流程
  • 【形式篇】年终总结怎么写:PPT如何将内容更好地表现出来
  • PyCharm简单调试
  • open61499符合新型工业控制测试要求吗
  • 2023年6月18日的CDGA/CDGP数据治理认证考试报名开始啦!
  • 主机系统扫描程序设计
  • 阿里6年,一个32岁女软件测试工程师的心声
  • Unity Render Streaming 云渲染
  • Spring Security 6.0系列【6】源码篇之表单登录认证流程
  • 信息系统项目管理师第四版知识摘编:第12章 项目质量管理​
  • 前端项目-05-轮播图banner和Floor组件开发-全局轮播图组件抽取
  • 【新2023Q2模拟题JAVA】华为OD机试 - 拼接 URL
  • matlab笔记总结(1)
  • (LDR6020)国产第一颗PD MCU 可以用于1to2快充线 无线充底座 手机散热背夹方案
  • 【蓝桥杯】【嵌入式组别】第十三节:PWM输入捕获编程
  • 2023-2029年中国环烷基润滑油行业竞争状况及投资前景趋势报告
  • Vue的数据更新了但页面没有更新及数据频繁更新而页面只更新一次
  • 蓝桥杯2019年国赛——递增序列
  • jdbctemplate,jpa,mybatis,mybatis-plus
  • [Django]创建项目+创建应用+启动服务
  • MySQL数据库中删除数据有哪些方法
  • react路由基础(六)
  • 淘宝开放平台API接口,接入方案如下
  • Learning Video Salient Object Detection Progressively from Unlabeled Videos笔记总结