shell脚本之免交互

交互:我们发出指令控制程序的运行,程序在接收到指令之后按照指令的效果做出对应的反应。

免交互:间接的通过第三方的方式把指令传送给程序,不用直接的下达指令。

Here Document 免交互:

这是命令行模式,也可以写在脚本当中。通过I/O重定向的方式将命令的列表传送给交互式程序或命令。

是标准输入的一种替代品。代替了人工的输入方式

语法格式:

命令(linux系统命令)<<标记

内容1

内容2

内容3

标记 (结尾)

注意事项:

1、标记可以是任意合法字符(一般不用特殊字符,不以数字开头,通常以EOF作为默认的标记位)

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

3、结尾的标记后面也不能有任何字符,包括空格

4、开头的标记前后空格都会被省略。

引入变量值

#!/bin/bash
file="test1.sh"
i=250
cat > $file <<EOF
ni shi $i
EOF

整体变量赋值

#!/bin/bash
var="Great! I am going to school"
myvar=$(cat <<EOF
this is monday
$var
EOF
)
echo $myvar

#!/bin/bash
var="Great! I am going to school"
myvar=$(cat <<'EOF'
this is monday
$var
EOF
)
echo $myvar

在开头标记加上单引号就会关闭变量赋值。

Expect实现免交互

用tcl语言写的一个工具,主要用自动化控制和测试,解决shell脚本的免交互问题。

转义符:

\n:换行

\r:回车

\t:相当于一个tab键

\b:表示退格,删除

#!/usr/bin/pxpect
#声明解释器,不再是默认的bash。需要声明
set timeout 5
#set设置,timeout超时,expect有一个默认的超时时间10秒。设置超时时间5秒
#也可以作为设置变量
spawn passwd bmm
#spawn后面用来声明需要执行的命令,开启会话过程,并且跟踪后续的交互信息。
​
expect "新的 密码:"
#捕获需要执行的命令行,只要能够捕获即可,不需要完整的,可以*代表所有
​
send "abc123\r"
#输入指令代码
​
expect "重新输入新的 密码:"
​
send "abc123\r"
​
#最后一定要有结束语,结束语只能写一个
expect eof
#交互指令结束之后,会退回原用户,切换回之前的用户
interact
#留在当前用户,不会动
#嵌入执行模式,在shell当中加入expect。涉及到环境的切换的场景不建议使用嵌套。
#ssh su不适合使用嵌入模式
#!/bin/bash
user=$1
passwd=$2
#非交互命令,使用的是shell脚本
useradd $user
#嵌入免交互
/usr/bin/expect << -EOF
spawn passwd $user
expect "新的*"
send "$password\r"
expect "重新*"
send "$password\r"
expect eof:
EOFex
#!/usr/bin/expect
set timeout 5
set hostname [lindex $argv 0]
set password [lindex $argv 1]
​
spawn ssh $hostname
​
expect {
​
      "NO route to host" {send_user "主机名/ip有误\n"}#
      "Connection refusedi" {send_user "ssh连接拒绝\n"}
      "(yes/no)" {send "yes\r";exp_continue}
      "password" {send "$password\r"}
​
}
interact

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值