shell脚本之免交互

发布于:2024-12-07 ⋅ 阅读:(148) ⋅ 点赞:(0)

免交互

交互:当我们使用程序时,需要进入程序发出对应的指令,然后程序做出对应的执行结果
免交互:I/O重定向,通过这种方式把指令提交给程序,程序运行指令。

文本免交互

Here Document 文本免交互

命令 << 标记

........

........

标记

注意事项
1、标记位可以时任意合法字符(EOF作为标记)

2、结尾的标记一定要顶格写,前面不能有空格,也不能有空格,也不能有任何其他字符

3、开头的标记位,前后的空格都会被自动省略

变量配置

file='test1.txt'
i='sun'
cat >> $file <<EOF
today is "${i}"day
EOF
#在EOF外面的变量可以直接传入使用
var="study make me happy!"
myvar=$(cat <<EOF
today is monday!
sun is good
$var
EOF
)
echo $myvar
#EOF的输入内容可以直接赋值给变量

expect语法

expect语法:
1、#!/usr/bin/expect必须声明使用的解释器
2、使用expect的脚本不可以使用bash编译,必须是赋执行权限才可以使用
格式:

#!/usr/bin/expect
# 必须先声明解释器
set timeout 5
# 定义超时时间,5秒到了,进程直接结束,默认超时时间是10# set可以作为设置变量名(expect)
spawn passwd dn
# spawn表示开启一个会话,监控一个命令的执行过程,跟踪后续的交互信息
expect "新的密码:"
#开启捕获,匹配到需要输入的内容行
send "123abcd\r"
#send 用来模拟用户的输入过程
expect "重新输入新的密码:"
send "123abcd\r"
#expect的结束语句;
expect eof
当交互结束之后,退回到上一次的用户。也就是说,spawn 开始执行的用户是谁,就推回到谁。
interact
#当交互结束之后,留在当前用户不变。

切换用户

#!/usr/bin/expect
set timeout 5
#在脚本外传参
set username [lindex $argv 0]
#相当于shelL脚本的位置变量
#set username dn
#username=dn
set password [lindex $argv 1]
spawn su - $username
expect "密码"
send "$password\r"
expect "#"
send_user "ok"
#send_user相当于echo,打印指定内容
#expect eof
interact

嵌入模式:

以shell为主,然后在过程中嵌入expect,涉及到环境切换(切换用户,ssh远程连接)不建议使用嵌套模式。

#!/bin/bash
user=$1
password=$2
useradd -m -s /bin/bash $use
#开始使用嵌套,执行免交互
/usr/bin/expect <<-EOF
spawn passwd $user
expect "新的*"
send "${password}\r"
expect "重新*"
send "${password}\r"
expect eof
EOF