Linux免交互操作

一、Here Document

1、Here Document概述

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

2、语法格式

命令 <<标记
。。。
内容
。。。
标记

注意事项

  • 标记可以使用任意合法字符(通常为EOF)
  • 结尾的标记一定要顶格写,前面不能有任何字符
  • 结尾的标记后面也不能有任何字符(包括空格)
  • 开头标记前后的空格会被省略掉
  • 特殊字符“<<”在标记和命令之前,这样做的目的是将命令块的输出重定向到程序和命令的stdin。
  • 标记的选择要确保不会出现在其他地方,避免出现混淆;两个标记之间的内容被当做是一个文件并用作“命令”的标准输入。
  • 另外Here Document也可以与非交互式程序和命令一起使用

3、实验

  • 免交互方式实现对行数的统计,将要统计的内容置于标记“EOF”之间,直接将内容传给wc -l来统计。
    在这里插入图片描述

  • 通过read命令接受输入并打印,输入值是两个EOF标记之间的部分,作为变量i的值
    在这里插入图片描述

  • 通过passwd给用户设置密码
    在这里插入图片描述

  • 支持变量替换
    在写入文件时会先将变量替换成实际值,再结合cat命令完成写入
    在这里插入图片描述
    在这里插入图片描述

  • 关闭变量替换功能,按照字符原本的样子输出,不做任何修改或替换
    在这里插入图片描述
    在这里插入图片描述

  • 去掉每行之前的tab字符(制表符)

在这里插入图片描述

  • 多行注释
    Bash的默认注释是“#”,该注释方法值支持单行注释;Here Document的引入解决了多行注释的问题。
    “:”代表什么都不做的空命令,中间标记区域的内容不会被执行,会被bash忽略掉,因此可达到批量注释的效果
    在这里插入图片描述

二、Expect

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

==在这里插入图片描述
基本命令

  • 脚本解释器
    expect脚本中首先引入文件,表面使用的是哪儿一个shell。
    #!/usr/bin/expect

  • spawn
    spawn后面通常跟一个Linux执行命令,表示开启一个会话、启动进程,并跟踪后续交互信息
    例:spawn passwd root(跟踪passwd root命令)

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

  • send
    向进程发送字符串,用于模拟用户的输入;该命令不能自动回车换行,一般要加\r(回车)或者\n(换行)
    例:
    方式一:
    expect “密码” {send “abc123\r”} 注意:同一行send部分都要有{}
    方式二:
    expect“密码”
    send “abc123\r” 注意:换行send部分不需要有{}
    方式三:
    expect支持多个分支
    expect
    {
    “密码” {send “abc123\r”}
    “密码” {send “123123\r”}
    “密码” {send “abcabc\r”}
    }
    注意:只要匹配了其中一个情况,执行相应的send语句后退出该expect语句

结束符

  • expect eof
    表示交互结束,等待执行结束,退回到原用户,与spawn对应
    比如切换到root用户,expect脚本默认的是等待10s,当执行完命令后,默认停留10s后,自动切回了原用户

  • interact:
    执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回原终端,这个时候就可以手工操作了,interact后的命令不起作用,比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。
    使用interact会保持在终端而不会退回到原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另一台服务器,会一直在目标服务器终端,而不会切回到原服务器。
    注意:expect eof与interact只能二选一。

  • set
    expect默认的时间是10秒,通过set命令可以设置会话超时时间,若不限制超过时间则应设置为-1.
    例:
    set timeout 30

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

例如:
将判断交互输出中是否存在yes/no或者password。如果匹配yes/no则输出yes并再次执行判断;如果匹配password则输出abc123并结束该段expect语句。
不设置的情况下是:
在这里插入图片描述
设置免交互
在这里插入图片描述
expect命令只会进入,无法进行命令操作,默认是十秒之后退出,若想要在另一台主机上进行操作,需要将exoect eof改成interact

在这里插入图片描述

expect直接执行,需要使用 expect 命令去执行脚本
su切换用户
#!/usr/bin/expect
#设置超时时间
set timeout 5
#参数传入
set username [lindex $argv 0]
set password [lindex $argv 1]
#开始追踪命令
spawn su KaTeX parse error: Expected ‘EOF’, got ‘#’ at position 10: username #̲免交互执行,捕捉信息并匹配 e…password\r"
expect “*]#”
send_user “ok”
#把控制权交给控制台
interact
#expect eof

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

在这里插入图片描述
实现ssh自动登录
在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值