网站备案提交资料,动漫设计与制作专业学什么,做公益做的好的的网站,广告设计公司是做什么的交互#xff1a;我们发出指令控制程序的运行#xff0c;程序在接收到指令之后按照指令的效果做出对应的反应。
免交互#xff1a;间接的通过第三方的方式把指令传送给程序#xff0c;不用直接的下达指令。
1、here document免交互
ere document免交互#xff1a;是命令…交互我们发出指令控制程序的运行程序在接收到指令之后按照指令的效果做出对应的反应。
免交互间接的通过第三方的方式把指令传送给程序不用直接的下达指令。
1、here document免交互
ere document免交互是命令行格式也可以写在脚本当中通过I/O重定向的方式将命令的列表传送给交互式程序或者命令
是标准输入的一种替代品代替了人工的输入方式
语法格式
命令linux的系统命令标记
内容1
内容2
内容3
标记
#wc 统计字符串
[rootlocalhost /]# wc -l xy102123456789xy102
3
注意事项
1、标记可以是任意的合法字符一般不用特殊字符不以数字开头通常以EOF作为默认的标记位
2、结尾的标记位一定要顶格写且前面不能有任何字符空格也不行。
3、结尾的标记后面也不能有任何字符包括空格
4、开头的标记前后的空格都会被省略掉
#使用免交互修改用户密码
[rootlocalhost /]# passwd dn EOF123123EOF
#使用免交互赋值
[rootlocalhost /]# read i EOF
123
EOF
[rootlocalhost /]# echo $i
123
2、tee命令免交互
[rootlocalhost opt]# tee jh1.txt EOF123EOF
1
2
3
3、引入变量
创建mjh1.sh脚本写入以下内容
[rootlocalhost opt]# cat mjh1.sh
#!/bin/bash
filetest9.sh
ischool
cat $file EOF
I am going to $i
EOF运行脚本生成test9.sh脚本文件 查看test9.sh脚本内容 4、 整体变量赋值
将var字符串内容整体赋值给myvar
#!/bin/bash
vargood I am going to school
#整体赋值方式
myvar$(
cat EOF
zhangsan say
$var
EOF
)
echo $myvar输出结果
[rootlocalhost opt]# sh mjh1.sh
zhangsan say good I am going to school将EOF加单引号关闭整体变量赋值
#!/bin/bash
vargood I am going to school
myvar$(
cat EOF
zhangsan say
$var
EOF
)
echo $myvar
输出结果
[rootlocalhost opt]# sh mjh1.sh
zhangsan say $var
5、Expect实现免交互
用tcl语言写的一个工具主要用自动化控制和测试。解决shell脚本交互的问题
需要先下载
[rootlocalhost opt]# yum -y install expect
实例
#!/usr/bin/expect
#声明解释器不再是默认的bash需要声明使用whereis expect 查找目录位置
set timeout 5
#set 设置,timeout 超时时间expect有一个默认的超时时间10秒设置超时时间5秒
#set也可以作为设置变量
spawn passwd dn
#spawn用来声明需要执行的命令开启会话过程并且跟踪后续的交互信息
expect 新的 密码:
#expect来捕获需要执行的命令行
#捕获不需要完整的可以使用*代表所有
send zlm12388\r
#send 表示输入指令代码\r表示回车
expect 重新输入新的 密码:
send zlm12388\rexpect eof
#交互指令结束之后会退回原用户切换回之前的用户
#interact
#留在当前用户不会改变#最后一定要有结束语,以上两个只能选一个 执行脚本要先赋权使用./的方式执行
实例普通用户进行切换
#!/usr/bin/expect
set timeout 5
set username [lindex $argv 0]
set password [lindex $argv 1]
#位置变量#开始追踪
spawn su - $username
#免交互开始执行
expect 密码
send $password\r
#继续捕获
expect ~]$
send_user ok
#send_user echo 打印指定内容
#结束语
interact 实现效果
结束语使用 expect eof效果 6、 嵌入执行模式
嵌入执行模式在shell当中加入expect涉及到环境切换的场景不建议使用嵌套
例如ssh su 不适用使用嵌入模式
#!/bin/bash
user$1
password$2
#非交互命令使用的是shell
useradd $user
#嵌入免交互
/usr/bin/expect -EOF
spawn passwd $user
expect 新的*
send $password\r
expect 重新*
send $password\r
expect eof
EOF 实现效果 7、使用ssh连接其他主机
基础版
#!/usr/bin/expect
set ip 192.168.10.30
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
实验效果 进阶版
#!/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
8、小练习
免交互实现硬盘分区分一个区即可分完之后第一步要格式第二步实现挂载挂载手动挂载然后在这个分区的挂载文件创建一个文件写入内容“学习真好”并且打印出结果在一个脚本里完成嵌入模式。
#!/bin/bash
# 使用shell
scan
# 列出所有块设备
lsblk
set timeout 5
# 设置超时时间为5秒
/usr/bin/expect -EOF
spawn fdisk /dev/sdb
#进行分区
expect 命令
send n\r
expect (default p)
send p\r
expect 分区号
send 1\r
expect 起始 扇区
send \r
expect Last
send \r
expect (输入 m 获取帮助)
send w\rexpect eof
EOF
# 刷新分区表
partprobe /dev/sdb
# 列出所有块设备以检查新分区 以及过滤想要出现的分区
lsblk | grep sdb1 /dev/null
if [[ $? -eq 0 ]]
then
echo 分区被建立
mkfs.xfs -f /dev/sdb1
mkdir /data1
mount /dev/sdb1 /data1
df -hT
else
echo 分区没有被建立
fi
#写入内容
cat /data1/test1.txt EOF
学习真好
EOF
cat /data1/test1.txt
输出效果