【Shell脚本】免交互

目录

一.Here Document免交互

1.Here Document概述

2.Here Document使用注意事项

3.Here Document运用

3.1.通过read命令接收输入并打印

3.2.wc -l的内容行数统计

3.3.passwd用户密码的修改

3.4.cat查看内容

3.5.tee重定向输出加标准输出

二.Here Document变量使用

1.交互内容输出变量

1.1.支持变量替换

1.2.输出

2.交互内容中不输出变量

2.1.加单引号

2.2.加反斜杠

3.实现多行注释

4.去除tab键影响

三.Except实现免交互

1.Except概述

2.Except安装

3.编写expect免交互脚本步骤

3.1.先声明解释器

3.2.接收位置参数传入

3.3.使用 spawn 指定交互命令 开启会话跟踪

3.4.使用 expect 捕获匹配交互命名的提示信息

补充except

3.5.再使用 send 发送需要交互输入的字符串,结尾需要加上回车符

补充send

四.Expect免交互脚本

示例1:ssh远程登录 

示例2:免交互预设值修改密码

示例3:su命令切换用户

示例4:fdisk分区操作


一.Here Document免交互

1.Here Document概述

  • 使用I/O重定向的方式将命令列表提供给交互式程序
  • 标准输入的一种替代品
  • 语法格式

命令 <<开始标记
 
...
 
...
 
结尾标记

2.Here Document使用注意事项

  • 标记可以使用任意合法字符
  • 结尾的标记一定要顶格写,前面不能有任何字符
  • 结尾的标记后面也不能有任何字符(包括空格)
  • 开头标记前后的空格会被省略掉

3.Here Document运用

3.1.通过read命令接收输入并打印

[root@localhost ~]# read a <<EOF
> zx like xiaojiejie
> EOF
[root@localhost ~]# echo $a
zx like xiaojiejie

3.2.wc -l的内容行数统计

[root@localhost ~]# wc -l <<EOF
> abc
> 123
> xyz
> 567
> EOF
4

3.3.passwd用户密码的修改

[root@localhost ~]# passwd zhangsan <<EOF
> abc12345
> abc12345
> EOF

3.4.cat查看内容

3.5.tee重定向输出加标准输出

原文件内容

[root@localhost ~]# vim test3.txt
[root@localhost ~]# tee test3.txt <<EOF
> zx like xiaomeimei
> EOF
zx like xiaomeimei
[root@localhost ~]# cat test3.txt
zx like xiaomeimei

二.Here Document变量使用

1.交互内容输出变量

[root@localhost day20]# vim demo1.sh
[root@localhost day20]# bash demo1.sh
[root@localhost day20]# cd /opt/
[root@localhost opt]# ls
local.repo  rh

#!/bin/bash
file_path=/opt/local.repo
repo_path=/mnt

cat <<EOF > $file_path
[local]
name=local
baseurl=file://$repo_path
enabled=1
gpgcheck=0
EOF

1.1.支持变量替换

[root@localhost day20]# vim demo1.sh
[root@localhost day20]# bash demo1.sh
[root@localhost day20]# cd /opt/
[root@localhost opt]# ls
base.repo  demo1.sh  local.repo  rh

#!/bin/bash
file_path=/opt/base.repo
repo_path=/data

cat <<EOF > $file_path
[local]
name=local
baseurl=file://$repo_path
enabled=1
gpgcheck=0
EOF

1.2.输出

[root@localhost day20]# vim demo1.sh
[root@localhost day20]# bash demo1.sh
[local]
name=local
baseurl=file:///data
enabled=1
gpgcheck=0

#!/bin/bash
file_path=/opt/base.repo
repo_path=/data

cat <<EOF
[local]
name=local
baseurl=file://$repo_path
enabled=1
gpgcheck=0
EOF

2.交互内容中不输出变量

[root@localhost day20]# vim demo1.sh
[root@localhost day20]# bash demo1.sh
[local]
name=local
baseurl=file://$repo_path
enabled=1
gpgcheck=0

2.1.加单引号

#!/bin/bash
file_path=/opt/base.repo
repo_path=/data

cat <<'EOF'
[local]
name=local
baseurl=file://$repo_path
enabled=1
gpgcheck=0
EOF

2.2.加反斜杠

3.实现多行注释

加   :

注意:换#号效果会更好

4.去除tab键影响

开头标记前要加 -

三.Except实现免交互

1.Except概述

  • 建立在tcl之上的一个工具
  • 用于进行自动化控制和测试
  • 解决shell脚本中交互相关的问题

2.Except安装

[root@localhost day20]# yum install -y expect

3.编写expect免交互脚本步骤

3.1.先声明解释器

#!/usr/bin/expect

3.2.接收位置参数传入

set 变量名 [lindex $argv 0]     

0代表执行脚本时后面跟的第一个位置参数,第二个位置参数用 1 表示,依此类推

3.3.使用 spawn 指定交互命令 开启会话跟踪

spawn fdisk /dev/sdb

3.4.使用 expect 捕获匹配交互命名的提示信息

expect "命令(输入 m 获取帮助):"
补充except
  • 判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回
  • 只能捕捉由spawn启动的进程的输出
  • 用于接收命令执行后的输出,然后和期望的字符串匹配

3.5.再使用 send 发送需要交互输入的字符串,结尾需要加上回车符

send "n\r"
....
补充send
  • 向进程发送字符串,用于模拟用户的输入
  • 该命令不能自动回车换行,一般要加\(回车)

四.Expect免交互脚本

示例1:ssh远程登录 

#!/usr/bin/expect

set dest_host [lindex $argv 0]
set password [lindex $argv 1]

spawn ssh $dest_host
expect {
     "Connection refused" {send_user "目标主机访问被拒绝\n"}
     "No route to host" {send_user "目标主机没有开机\n"}
     "(yes/no)" {send "yes\r"; exp_continue;}
     "*password:" {send "$password\r"}
}

interact

虚拟机上关闭

虚拟机上开启

成功

示例2:免交互预设值修改密码

#!/usr/bin/expect

set username [lindex $argv 0]
set password [lindex $argv 1]

spawn passwd $username
expect "新的 密码: " {send "${password}\r"}
expect "重新输入*" {send "${password}\r"}

expect eof

[root@localhost day20]# chmod +x demo3.sh
[root@localhost day20]# ./demo3.sh zhangsan 123456

示例3:su命令切换用户

#!/usr/bin/expect

set timeout 1

set username [ lindex $argv 0 ]
set password [ lindex $argv 1 ]

spawn su $username
expect "密码"
send "$password\n"

expect  "*]#"
send_user "$username 切换成功!"

interact

示例4:fdisk分区操作

#!/usr/bin/expect

set timeout  5
set name [lindex $argv 0]

spawn fdisk $name
expect "获取帮助"
send "n\r"
expect "Select"
send "p\r"
expect "分区号"
send "\r"
expect "起始"
send "\r"
expect "Last"
send "+10G\r"
expect "命令"
send "w\r"

interact

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值