1、概念
不需要进入到文件内部,可以在文件外对文件内容进行操作
2、如何对文本内容进行免交互
here document 免交互
语法格式:
命令 << 标记
内容
已开头的标记结尾
注意事项:
1、标记可以使用任意合法字符(字母和数字,一般不使用特殊符号,一般以字母开头,EOF )
2、结尾标记一定要顶格写而且结尾的标记前不能有任何字符(空格也不能有)
3、开头标记可以加空格,但是会被自动省略(开头标记前,一般也没有空格)
具体用法
统计文本行数
通过免交互给用户设置密码
对文本内容输入
tee 本身就具有标准输出的作用,可以直接内容输入到文件当中
通过整体赋值给变量
在标记上加上单引号无法赋值给变量
3、expect 免交互
自动化控制和测试,用来解决shell脚本当中交互问题
expect建立在tcl语言基础上(要想实现expect免交互先安装这个服务)
3.1、执行方式
.sh
./test.sh
/opt/test.sh
3.2、常用的转义字符
\n: 相当于换行,回车
\t : 制表符,相当于tab键
\r :就是回车键
\b:退格符(backspace)
3.3、使用方法
使用expect必须要先声明(#!usr/bin/expect)
spawn后面一般都是linux的命令,表示开启会话或者进程,跟踪后续的交互信息
expect 捕获 , 命令的相关内容,字符串匹配
send 发送指令,模拟用户的输入
send使用的三种方法
方法一:
expect “密码” {send “123456\r”}
写在一行,必须要用花括号括起来
方法二:
expect “密码”
send “123456\r”
换行不需要花括号
方法三:多分支匹配
expect {
“密码1” {send “123456\r”}
“密码2” {send “123456\r”}
“密码3” {send “123456\r”}
}
结束符:
expect eof
表示交互结束,等待执行结束,退回到原来的用户
expect 默认等待时间10s(秒)
退回之前的终端
interact 执行完成之后,保持状态,把控制权交给控制台,然后停留在目标终端,不会退回原终端
注意点:这两个结束符只能选择一个(二选一)
set 定义变量,设置参数
set timeout 5 设置等待时间5秒
set hostname [lindex $argr 0]
hostname=$1
set passwd [lindex $argv 1]
passwd=$2
exp_continue 和expect 捕获命令结合一起使用,附加在expect判断项之后,匹配到expect的捕获内容之后,还能够继续判断expect捕获语句当中的其他选项
格式:
expect {
”connecting (yes/no)?“ {send "yes\r"; exp_continue;}
}
send_user 回显命令,跟echo一样,打印内容
脚本免交互修改密码(用户固定的)
脚本免交互修改密码(随意用户密码)
嵌入执行,将expect免交互的过程和shell结合起来
ssh su会涉及到终端切换,不建议使用嵌入式执行
#!/bin/bash
user=$1
passwd=$2
#不需要交互的命令可以放在expect外面执行
useradd $user
#密码环节我们开始执行免交互
/usr/bin/expect <<-EOF
#开启执行的表示,仅限于嵌入式
spawn passwd $user
expect "New*"
send "${passwd}\r"
expect ""
send "${passwd}\r"
expect eof
EOF
传参方式交互