免交互的简单实现

一、免交互
1.1 简单解释免交互
交互:在计算机中,交互一般指发出指令控制程序的运行,程序在接收到指令之后按照指令的效果做出对应的反应。

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

Here Document 免交互

这是命令行格式,也可以写在脚本当中。通过I/O重定向的方式将命令的列表传送给交互式程序或命令。是标准输入的一种替代品,代替了人工的输入方式。

语法格式:

命令(Linux的系统命令) <<标记
内容1
内容2
内容3
标记

注意事项:

标记可以是任意合法字符,一般不用特殊字符、不以数字开头,通常以EOF作为默认的标记位。
结尾的标记一定要顶格写,前面不能有任何字符,空格也不行。
结尾的标记,后面也不能有任何字符,包括空格。
开头的标记前后的空格都会被省略掉,不影响标记的内容。
例:

cat <<EOF >>test1.txt
cat >>test1.txt <<EOF

上述都可以在命令行向test1.txt输入文本了,直到输入文本EOF作为结束标志

tee test1.txt <<EOF

tee主要用于从标准输入读取数据,并将其写入到一个或多个文件,同时也可以将数据输出到标准输出(通常是终端)。

1.2 变量赋值
变量赋值

vim c1.sh

#!/bin/bash
file="c1.txt"
i=school
cat > $file <<EOF
I am gonna boom boom $i
EOF
sh c1.sh
cat c1.txt

整体变量赋值

#!/bin/bash
var="Great! I'm gonna boom boom the school!"
myvar=$(cat <<'EOF'
This is Monday!
$var
EOF
)
echo $myvar
cat <<-EOF
# -EOF可以忽略tab的大空格,对小空格无效

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

使用expect需要先安装expect,

转义符:

\n :换行
\r :回车键
\t :横向制表符,相当于按TAB键
\b :退格,backspace
例:

#!/usr/bin/expect
#首行声明解释器,不再是默认的/bin/bash,需要声明
set timeout 5
#设置超时时间,expect有一个默认的超时时间10秒,这里手动设置为5秒

spawn passwd ykw
#spawn用来声明需要执行的命令,开启会话过程,并跟踪后续的交互信息
#相当于在命令行输入命令 passwd ykw

expect "新的 密码:"
#捕获需要执行的命令行

send "abc123\r"
#输入指令代码 abc123 \r表示输入回车

expect "重新输入新的 密码:"
send "abc123\r"

#最后一定要在下面两个指令中选取一行作为结束语,不能都写
expect eof
#交互指令结束之后,会退回原用户
interact
#交互指令结束之后,留在当前用户

expect免交互文件的解释器不是/bin/bash,不能用sh bash来执行,要赋权后,用.来执行,即需要先chmod 777 file,然后再执行

set :也可以用于设置变量

expect :捕获的时候不一定要捕获全文,只要能捕获到内容即可

例:传参到脚本执行:

#!/usr/bin/expect
set timeout 5
#传参的方式来表示
set username [lindex $argv 0]
set password [lindex $argv 1]
#上面的两个变量相当于shell脚本的位置变量$1,$2

#开始追踪
spawn su - $username
#免交互开始执行
expect "Password"
send "$password\r"
#继续捕获
expect "$username"
#expect "~]$"
send_user "ok\r"
#sleep 1
send "\x04"
#send_user 相当于 echo ,打印指定内容
#send "\x04" 是输入ASCII码的eof,使脚本结束
#结束语
expect eof
#interact
#会留在当前用户

1.4 嵌入执行模式
在shell当中加入expect。涉及到环境的切换的场景不适合使用嵌套。如ssh、su等

例:

#!/bin/bash
user=$1
password=$2
#非交互命令。使用的是shell
useradd $user
#嵌入免交互
/usr/bin/expect <<-EOF
spawn passwd $user
expect "New"
send "${password}\r"
expect "Retype"
send "${password}\r"
expect eof
EOF

1.5 练习:
例:用expect实现ssh免交互登录root@20.0.0.20

#!/usr/bin/expect
set ip 20.0.0.20
set user root
set password 123
set timeout 5

#进入命令行
spawn ssh $user@$ip

expect {
		"yes/no" {send "yes\r";exp_continue}
#这里要捕获两次,表示该项被匹配之后,还能继续匹配其他的指定内容
#类似循环中的continue,允许expect语句继续向下执行
		"password" {send "$password\r"} 
}
interact

传参实现ssh

#!/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 refused" {send_user "ssh连接拒绝\n"}
		"(yes/no)" {send "yes\r";exp_continue}
		"password" {send "$password\r"}
}
#
interact

例:一个脚本完成要求:免交互实现磁盘分区,分一个区即可,分完之后,第一步格式化,第二步实现挂载,手动挂载即可,然后在分区挂载点创建一个文件,写入内容"学习使我快乐!"并打印。

下面的操作都是对一个未分区的硬盘进行的:

#!/bin/bash
disk=$1
/usr/bin/expect <<-EOF
set timeout 5
spawn fdisk /dev/$disk
expect "Command" 
send "n\r"
expect {
		"Select" {send "\r";exp_continue}
		"Partition number" {send "\r";exp_continue}
		"First sector" {send "\r";exp_continue}
		"Last sector" {send "\r";exp_continue}
		"Command" {send "w\r"}
}
expect eof
EOF

partprobe
lsblk | grep "${disk}1"
if [ $? -eq 0 ];then
  echo "分区/dev/${disk}1已建立!"
else
  echo "未检测到分区,请检查!"
  exit
fi
mkfs.xfs /dev/${disk}1
mkdir /opt/${disk}1
mount /dev/${disk}1 /opt/${disk}1
echo "学习使我快乐" > /opt/${disk}1/test.txt
cat /opt/${disk}1/test.txt

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值