Shell之免交互

目录

[一、Here Document免交互](#一、Here Document免交互)

[1.Here Document简介](#1.Here Document简介)

[2.Here Document注意事项](#2.Here Document注意事项)

[3.Here Document实操](#3.Here Document实操)

[1.wc -l统计行数量](#1.wc -l统计行数量)

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

3.passwd用户密码的修改

4.cat查看内容

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

[二、Here Document变量使用](#二、Here Document变量使用)

1.交互内容输出变量

2.支持变量替换

输出

3.关闭变量替换功能-加单引号

4.关闭变量替换功能-加反斜杠

5.实现注释效果

6.输出时忽略tab符号

三、expect免交互

1.expect的基本命令

(1)脚本解释器

(2)spawn

(3)expect

(4)send

(5)结束符

(6)set

(7)exp_continue

(8)send_user

(9)接收参数

2.expect实操

1.ssh远程登录

2.免交互预设值修改密码

3.su命令切换用户

4.fdisk分区操作


一、Here Document免交互

1.Here Document简介

  • 使用I/O重定向的方式将命令列表提供给交互式程序

  • 标准输入的一种替代品

  • 语法格式

    命令 <<开始标记

    ...

    ...

    结尾标记

2.Here Document注意事项

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

3.Here Document实操

1.wc -l统计行数量
复制代码
统计输入内容中的行数的命令
[root@localhost ~]# wc -l <<EOF
> q
> a
> z
> w
> EOF
2.通过read命令接收输入并打印
复制代码
[root@localhost ~]# read a <<EOF
> zx = zhuyou
> EOF
[root@localhost ~]# echo $a
zx = zhuyou
3.passwd用户密码的修改
复制代码
[root@localhost ~]# passwd xhao <<EOF
> abc123               #新密码
> abc123               #确认密码   
> EOF
更改用户 xhao 的密码 
新的 密码:无效的密码: 密码少于 7 个字符
重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。
4.cat查看内容

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

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

修改前原文件内容↓

修改后↓

复制代码
[root@localhost ~]# tee 1.txt <<EOF
> zx no like xiaogege
> zx like laonanren
> EOF
zx no like xiaogege
zx like laonanren
[root@localhost ~]# cat 1.txt
zx no like xiaogege
zx like laonanren

二、Here Document变量使用

1.交互内容输出变量

复制代码
[root@localhost ~]# vim 20.sh
[root@localhost ~]# bash 20.sh
[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
local.repo  rh

[root@localhost ~]# vim 20.sh

#!/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

2.支持变量替换

复制代码
[root@localhost ~]# vim 20.1.sh

#!/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

复制代码
[root@localhost ~]# vim 20.1.sh
[root@localhost ~]# bash 20.1.sh
[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
20.sh  base.repo  local.repo  rh

输出
复制代码
[root@localhost ~]# vim 20.2.sh

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

cat <<EOF
[local]
name=local
baseurl=file://$repo_path
enabled=1
gpgcheck=0
EOF
复制代码
[root@localhost ~]# bash 20.2.sh
[local]
name=local
baseurl=file:///data
enabled=1
gpgcheck=0

3.关闭变量替换功能- 加单引号

复制代码
[root@localhost ~]# vim 20.3.sh

th=/opt/base.repo
repo_path=/data
 
cat <<'EOF'
[local]
name=local
baseurl=file://$repo_path
enabled=1
gpgcheck=0
EOF
复制代码
[root@localhost ~]# bash 20.3.sh
[local]
name=local
baseurl=file://$repo_path
enabled=1
gpgcheck=0

4.**关闭变量替换功能-**加反斜杠

复制代码
[root@localhost ~]# vim 20.3.sh

th=/opt/base.repo
repo_path=/data

cat <<EOF
[local]
name=local
baseurl=file://\$repo_path
enabled=1
gpgcheck=0
EOF
javascript 复制代码
[root@localhost ~]# vim 20.3.sh
[root@localhost ~]# bash 20.3.sh
[local]
name=local
baseurl=file://$repo_path
enabled=1
gpgcheck=0

5.实现注释效果

注意:换#号效果会更好

javascript 复制代码
[root@localhost ~]# vim 20.4.sh

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

cat <<EOF
[local]
name=local
baseurl=file://$repo_path
enabled=1
gpgcheck=0
EOF
javascript 复制代码
[root@localhost ~]# vim 20.4.sh
[root@localhost ~]# bash 20.4.sh
[local]
name=local
baseurl=file://
enabled=1
gpgcheck=0

6.输出时忽略tab符号

加"-",忽略tab字符

javascript 复制代码
[root@localhost ~]# vim 20.5.sh

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

cat <<-EOF
[local]
       name=local
          baseurl=file://\$repo_path
enabled=1
gpgcheck=0
EOF
javascript 复制代码
[root@localhost ~]# vim 20.5.sh
[root@localhost ~]# bash 20.5.sh
[local]
       name=local
          baseurl=file://$repo_path
enabled=1
gpgcheck=0

三、expect免交互

1.expect的基本命令

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

(1)脚本解释器

expect 脚本中首先引入文件,表明使用的是哪一个 shell。

javascript 复制代码
#!/usr/bin/expect
(2)spawn

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

javascript 复制代码
例:spawn passwd root
(3)expect

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

(4)send

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

方式一:

复制代码
expect "密码" {send "abc123\r"}		#同一行send部分要有{}

方式二:

javascript 复制代码
expect "密码"

send "abc123\r" #换行send部分不需要有{}

方式三:

javascript 复制代码
expect支持多个分支


expect #只要匹配了其中一个情况,执行相应的send语句后退出该expect语句

{

"密码1" {send "abc123\r"}

"密码2" {send "123456\r"}

"密码3" {send "123123\r"}

}
(5)结束符

expect eof

表示交互结束,等待执行结束,退回到原用户,与spawn对应。

比如切换到root用户,expect脚本默认的是等待10s,当执行完命令后,默认停留10s后,自动切回了原用户.

interact

执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命令不起作用,比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。

使用interact会保持在终端而不会退回到原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另一服务器,会一直在目标服务器终端,而不会切回的原服务器。

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

(6)set

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

javascript 复制代码
例:set timeout 30
(7)exp_continue

exp_continue附加于某个expect判断项之后,可以使该项被匹配后,还能继续匹配该 expect判断语句内的其他项。

exp_continue类似于控制语句中的continue语句。表示允许expect继续向下执行指令。

exp_continue表示循环式匹配,通常匹配之后都会退出语句,但如果有exp_continue则可以不断循环匹配,输入多条命令,简化写法.

javascript 复制代码
expect {
    "(yes/no)" {send "yes\r"; exp_continue;}
    "*password" {set timeout 300; 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开始,分别表示第一个,第二个,第三个...参数。

2.expect实操

1.ssh远程登录
javascript 复制代码
#!/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

192.168.80.101虚拟机端关闭sshd👇

192.168.80.101虚拟机端开启sshd👇

成功!!!!!

2.免交互预设值修改密码
javascript 复制代码
[root@localhost day20]# vim demo2.sh

#!/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
javascript 复制代码
[root@localhost day20]# chmod +x demo2.sh
[root@localhost day20]#  ./demo2.sh zzz 123456
3.su命令切换用户
javascript 复制代码
[root@localhost day20]# vim demo3.sh

#!/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分区操作
javascript 复制代码
[root@localhost day20]# vim demo4.sh

#!/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
相关推荐
marsh020611 分钟前
43 openclaw熔断与降级:保障系统在异常情况下的可用性
java·运维·网络·ai·编程·技术
摇滚侠13 分钟前
Docker 如何查询挂载的目录
运维·docker·容器
勇闯逆流河1 小时前
【Linux】linux进程控制(进程池的详解与实现)
linux·运维·服务器
zhangfeng11332 小时前
部署到服务器上 宝塔系统 使用宝塔在线编辑器 FTP 批量上传 Git 部署 打包上传 codebudyy 编程程序开发
服务器·git·编辑器
WJ.Polar2 小时前
Scapy基本应用
linux·运维·网络·python
lljss20202 小时前
1. NameServer 域名服务器---NS
linux·服务器·前端
萧行之3 小时前
Ubuntu+Windows双系统:解决GRUB不显示Windows启动项、一闪而过问题
linux·windows·ubuntu
数智顾问3 小时前
(123页PPT)华为流程管理体系精髓提炼(附下载方式)
运维·华为
Yupureki4 小时前
《Linux网络编程》5.HTTPS协议
linux·网络·https
网络工程小王4 小时前
【LCEL 链式调用详解】调用篇-2
java·服务器·前端·数据库·人工智能