使用I/O重定向的方式将命令列表提供给交互式程序或命令,比如ftp、passwd、sudo、ssh、cat或read命令。
是标准输入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个“文件”并用作“命令”的标准输入。
Here Document也可以与非交互式程序和命令一起使用。
- 命令 <<标记 (此处标记的前后面可以有空格)
- ...
- 内容 #标记之间是传入内容
- ...
- 标记 #结尾的标记字符要和开头的标记字符,保持相同的大小写,并且结尾标记必须要顶格写
- [root@localhost /home]#cat <<EOF
- > hello
- > moto
- > EOF
- hello
- moto
- [root@localhost /home]#cat >name<<EOF
- > zhangsan
- > lisi
- > wangwu
- > EOF
- [root@localhost /home]#cat name
- zhangsan
- lisi
- wangwu
-
- [root@localhost /home]#cat >>name<
- > xiaoming
- > EOF
- [root@localhost /home]#cat name
- zhangsan
- lisi
- wangwu
- xiaoming
-
- [root@localhost /home]#wc -l <<EOF
- > test1
- > test2
- > test3
- > EOF
- 3
-
- #通过read 命令接收输入并打印,输入值是两个EOF标记之间的部分,作为变量 a 的值
- [root@localhost /home]#read a <<EOF
- > 8
- > EOF
- [root@localhost /home]#echo $a
- 8
-
- [root@localhost /home]#useradd laowang
- [root@localhost /home]#passwd laowang <<EOF
- > 123456
- > 123456
- > EOF
- 更改用户 laowang 的密码 。
- 新的 密码:无效的密码: 密码少于 8 个字符
- 重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。
-
- [root@localhost /home]#vim test.sh
- #!/bin/bash
- doc_file="gkd.txt"
- i="nanjing"
- cat > $doc_file <<EOF
- welcome to $i
- EOF
-
- [root@localhost /home]#sh test.sh
- [root@localhost /home]#cat gkd.txt
- welcome to nanjing
-
- [root@localhost /home]#vim test2.sh
- #!/bin/bash
- test="you are very good!"
- mylife=$(cat <<EOF
- 冲冲冲!
- 干就完了!!!
- $test
- EOF
- )
- echo $mylife
-
- [root@localhost /home]#sh test2.sh
- 冲冲冲! 干就完了!!! you are very good!
-
- #对标记加单引号,即可关闭变量替换
- [root@localhost /home]#aa=$(cat <<'EOF'
- > 10
- > $a
- > EOF
- > )
- [root@localhost /home]#echo $aa
- 10 $a
- [root@localhost /home]#echo $a
- 8
-
- [root@localhost /home]#vim test3.sh
- #!/bin/bash
- cat <<EOF
- hello
- EOF
- cat <<EOF
- word
- EOF
-
- [root@localhost /home]#sh test3.sh
- hello
- word
-
- [root@localhost /home]#vim test3.sh #EOF前面添加“-”能够去掉行首的tab制表符
- #!/bin/bash
- cat <<-EOF
- hello
- EOF
- cat <<-EOF
- word
- EOF
-
- [root@localhost /home]#sh test3.sh #加了“-”以后显示出的内容就会顶格显示
- hello
- word
-
- [root@localhost /home]#vim test4.sh
-
- #!/bin/bash
- : <<EOF #冒号表示多行注释,开头的标记内容不会被执行
- hello?
- who are you?
- EOF
- echo "What is the matter with you?"
-
- [root@localhost /home]#sh test4.sh
- What is the matter with you?
-
expect 是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预,就是一套用来实现自动交互功能的软件。且想要用之前先下载 Expect。
[root@localhost /home]#yum install -y expect
expect 脚本中首先引入文件,表明使用的是哪一个shell
#!/usr/bin/expect
spawn 后面通常跟一个Linux执行命令,表示开启一个会话、启动进程,并跟踪后续交互信息
spawn passwd root
向进程发送字符串,用于模拟用户的输入,该命令不能自动回车换行,一般要加 \r (回车) 或者 \n
- expect "密码" {send "abc123\r"} #同一行send部分要有{}
- 或
- expect "密码"
- send "abc123\r" #换行send部分不需要有{}
- expect
- "密码1"{ send "abc123\r"}
- "密码2"{ send "123456\r"}
- "密码3"{ send "123123\r"}
-
- #expect支持多个分支,只要匹配了其中一个情况,执行相应的send语句后退出该expect语句
expect eof
interact
需要注意的是:expect eof 与 interact 只能二选一
- su
- zhangsan -> lisi
- ssh192.168.80.10 ->192.168.80.20
-
- 使用expect eof会出现如下情况:
- zhangsan -> lisi --expect eof--> 退回到原用户zhangsan
- 192.168.80.10 -> 192.168.80.20 --expect eof--> 退回到原IP地址:192.168.80.10
-
- 使用interact会出现如下情况:
- zhangsan -> lisi --interact--> 仍然保持用户lisi的状态
- 192.168.80.10 ->192.168.80.20 --interact--> 仍然保持在IP地址:192.168.80.20
expect 默认的超时时间是10秒,通过 set 命令可以设置会话超时时间,若不限制超时时间则应设置为-1
set timeout 20
免交互修改密码:
- [root@test1 opt]# vim passwd.sh
-
- #!/usr/bin/expect #expect的路径指定使用expect编译器
- set timeout 3 #设置退时间
-
- spawn passwd zjf #开启修改密码
-
- expect "新的 密码:" #捕获
- send "123\r" #设置密码
- expect "重新输入新的 密码:" #捕获
- send "123\r" #设置密码
-
- expect eof #退出
免交互方式实现SSh登录:
-
- #!/usr/bin/expect
- set ip 192.168.198.12
- set user root
- set passwd 000000
- set timeout 5
- spawn ssh $user@$ip
- expect {
- "yes/no" {send "yes\n";exp_continue}
- "password" {send "${passwd}\n"}
- }
- interact