交互概念
交互指的是在程序运行过程中,用户可以通过发出指令控制程序的执行,而不是仅由程序单方面执行。例如,在多媒体播放时,用户可以暂停或调整音量。对于Linux操作系统,许多操作会涉及到交互,比如使用read
、ftp
、passwd
、su
、sudo
、fdisk
等命令。
Linux中的免交互应用
为了实现自动化运维,Linux常常需要实现免交互操作,避免人工干预。例如,可以使用Here Document和Expect等方法将命令提供给交互式程序,达到自动执行的效果。
免交互式操作(也称为非交互式操作)指在不需要用户干预的情况下,程序或脚本自动完成操作。这种方式广泛用于批量任务执行、自动化脚本和远程管理。实现免交互的常见方法有:
- Here Document
- Expect 脚本
- 重定向和管道
- 配置免密钥 SSH 登录
Here Document免交互
Here Document 是一种 I/O 重定向 技术,允许将一组命令或输入直接传递给一个程序,而无需创建临时文件。常用于向交互式命令提供输入。Here Document 使用 <<
操作符。
基本语法
命令 <<标记
...
内容
...
标记
注意事项
- 标记可以使用任意合法字符(通常为EOF);
- 结尾的标记一定要顶格写,前面不能有任何字符;
- 结尾的标记后面也不能有任何字符(包括空格);
- 开头标记前后的空格会被省略掉。
示例
-
行数统计:
免交互方式实现对行数的统计,将要统计的内容置于标记“EOF”之间,直接将内容传给 wc -l 来统计
wc -l <<EOF # 以什么为标记,就以什么为结束 Line1 Line2 EOF
-
读取输入:
通过 read 命令接收输入并打印,输入值是两个 EOF 标记之间的部分,作为变量 i 的值
read i <<EOF Hi EOF echo $i
-
设置用户密码:
通过 passwd 给用户设置密码
passwd lisi <<EOF abc1234 # 这两行是输入的密码和确认密码 abc1234 EOF
-
文件输出重定向:
通过cat实现查看和重定向输出到指定文件
cat <<EOF >test.txt # 覆盖写入到文件 # 或cat >test.txt <<EOF hello world EOF #输出: hello world
-
tee命令重定向输出加标准输出:
tee命令有标准输出的作用,可以直接重定向输入到文件中
tee test2.txt <<EOF this is tee test EOF # 输出: this is tee test
功能配置示例
-
支持变量替换:
在写入文件时会先将变量替换成实际值,再结合 cat 命令完成写入
#!/bin/bash file="test1.txt" i="school" cat > $file <<EOF I am going to $i EOF
-
整体赋值给变量再打印变量值:
整体赋值给变量,然后通过 echo 命令将变量值打印出来
#!/bin/bash var="Great! I am going to school!" myvar=$(cat <<EOF This is Line 1. Today is Monday. $var EOF ) echo "$myvar" # 输出: This is Line 1. Today is Monday. Great! I am going to school!
-
关闭变量替换,输出原字符:
关闭变量替换的功能,按照字符原本的样子输出,不做任何修改或替换
#!/bin/bash var="Great! I am going to school!" myvar=$(cat <<'EOF' # 对标记加单引号,即关闭变量替换 This is Line 1. Today is Monday. $var EOF ) echo $myvar # 最后一行直接输出成$var # 输出: This is Line 1. Today is Monday. $var
-
去掉每行之前的 TAB 字符:
在标记前加“-”,即可抑制各行首TAB,用空格无效
#!/bin/bash cat <<-'EOF' tab27 tab28 EOF # 输出: tab27 tab28
-
多行注释:
Bash 的默认注释是“#”,该注释方法只支持单行注释;
Here Document 的引入解决了多行注释的问题。
“:”代表什么都不做的空命令。中间标记区域的内容不会被执行,会被 bash 忽略掉,因此可达到批量注释的效果。
#!/bin/bash var="Great! I am going to school!" : <<EOF # 多行注释, # “:”开头的 Here Document 标记 # 内容不会被执行 This is Line 1. Today is Monday. $var EOF echo "$var" # $var为什么还能打印,已经定义了。 # 没有了前两行正常的输出,有$var的输出,因为var已经定义了。 # 输出: Great! I am going to school!
简化后:
: <<EOF a b c EOF # 输出没有任何结果,了解即可,还是用'#'注释直观