当前位置: 首页 > news >正文

免交互 实验

免交互

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

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

Here document 免交互

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

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

语法格式:

命令(linux的系统命令)<<标记
内容1
内容2
内容3
标记
[root@test2 opt]# wc -l << xy102
> 123
> 456
> xy102
2

注意事项:

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

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

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

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

[root@test2 opt]# cat <<eof>>test2.txt
> aaa
> bbb
> cccc
> dddd
> eof
[root@test2 opt]# cat test2.txt 
aaa
bbb
cccc
dddd
[root@test2 opt]# tee test3.txt<<eof
> aa
> bbc
> ss
> eof
aa
bbc
ss
[root@test2 opt]# cat test3.txt 
aa
bbc
ss

整体变量赋值

​
[root@test2 opt]# vim test1.txt 
#!/bin/bash
#引入变量
var="Great! I am going to school"
myvar=$(cat <<EOF
this is mondy
$var
EOF
)
echo $myvar
​
[root@test2 opt]# sh test1.txt 
this is mondy Great! I am going to school

标记加引号就不再往里传值

[root@test2 opt]# vim test1.txt 
#!/bin/bash
#引入变量
var="Great! I am going to school"
myvar=$(cat <<'EOF'
this is mondy
$var
EOF
)
echo $myvar
​
[root@test2 opt]# sh test1.txt 
this is mondy $var

免交互只对tab键

[root@test2 opt]# vim test1.txt 
#!/bin/bash
cat <<-'EOF'test1
test2
EOF
​
[root@test2 opt]# sh test1.txt 
test1
test2

Expect实现免交互

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

转义符

\n:换行

\r:回车

\t:相当于一个tab键

\b:表示退格,删除

免交互修改密码
[root@test3 opt]# vim passwd.sh
#!/usr/bin/expect
#声明解释器,不再是默认的bash。必须要写
set timeout 5
#set相当于设置,timeout超时时间,expect有一个默认超时时间10秒。设置超时时间5秒
​
spawn passwd wbl
#spawn后用来声明需要执行的命令,开启会话过程,并且跟踪后续的交互信息
expect "新的 密码:"
#捕获需要执行的命令行
send "abc123\r"
#输入指令代码
expect "重新输入新的 密码:"
send "abc123\r"
#最后结束语,结束语只能写一个
expect eof
#交互指令结束之后,会退回原用户,切换回之前的用户
#interact
#留在当前用户,不动
​
[root@test3 opt]# chmod 777 passwd.sh
​
[root@test3 opt]# ./passwd.sh
spawn passwd wbl
更改用户 wbl 的密码 。
新的 密码:
无效的密码: 密码少于 7 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
invalid command name "~"while executing
"~                                                                                                                                                     ..."(file "./passwd.sh" line 19)
连接另一台主机
#!/usr/bin/expect
set ip 192.168.65.22
set user root
set password 123
set timeout 5
​
#进入命令行
spawn ssh $user@$ip
expect {"yes/no" {send "yes\r";exp_continue}
#捕获两次,表示该项被匹配之后继续匹配其他指定内容。类似循环continue允许继续执行"*password" {send "$password\r"}
}
interact
结果
[root@test3 opt]# ./test1.sh
spawn ssh root@192.168.65.22
The authenticity of host '192.168.65.22 (192.168.65.22)' can't be established.
ECDSA key fingerprint is SHA256:vArlM9v0tBqTAeP9OCssdmVcDMvpAQlZkb3UPFaH0hY.
ECDSA key fingerprint is MD5:28:e9:05:f9:e5:68:ce:f8:4a:e3:98:2a:1a:43:88:e4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.65.22' (ECDSA) to the list of known hosts.
root@192.168.65.22's password: 
Last login: Tue Jun 25 10:51:59 2024 from 192.168.65.1
​

免交互磁盘分区?

#免交互实现磁盘分区,分一个区,第一步要格式,第二部要实现挂载(手动), #在这个分区的挂载创建一个文件,写入内容“学习正好”,并且打印 #在一个脚本里完成

[root@test3 opt]# vim disk.sh 
#!/bin/bash
disk=$1
/usr/bin/expect <<-EOF
spawn fdisk $disk
expect "命令(输入 m 获取帮助):"send "n\r"
expect "Select (default p):"send "\r"
expect "分区号 (1-4,默认 1):"send "\r"
expect "起始 扇区 (2048-41943039,默认为 2048):"send "\r"
expect "Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039)
:" 
send "+200M\r"
expect "命令(输入 m 获取帮助):"send "w\r"
expect eof
EOF
mkfs.xfs -f /dev/sdb1
if [ $? -eq 0 ]
then
mkdir /opt/date
mount /dev/sdb1 /opt/date
file="/opt/date/date.txt"
i="学习真好"
cat > $file <<EOF
$i
EOF
cat /opt/date/date.txt
else
echo "脚本有问题"
fi

结果

[root@test3 opt]# ./disk.sh /dev/sdb
spawn fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
​
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
​
​
命令(输入 m 获取帮助):n
Partition type:p   primary (0 primary, 0 extended, 4 free)e   extended
Select (default p): 
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+200M
分区 1 已设置为 Linux 类型,大小设为 200 MiB
​
命令(输入 m 获取帮助):w
The partition table has been altered!
​
Calling ioctl() to re-read partition table.
正在同步磁盘。
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=12800 blks=                       sectsz=512   attr=2, projid32bit=1=                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=51200, imaxpct=25=                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=855, version=2=                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
学习真好

1

http://www.lryc.cn/news/383619.html

相关文章:

  • Sublime Text 设置
  • spire.Pdf 将pdf转成image
  • 仓颉编程语言 -- 初识(一)
  • 前端JS必用工具【js-tool-big-box】学习,数值型数组的正向排序和倒向排序
  • python web框架哪家强?Flask、Django、FastAPI对比
  • Mybatis plus:IService接口
  • 时序分析基本概念介绍——min pulse width 最小脉冲宽度
  • PHP原生代码生成pdf---解决中文乱码问题
  • 智慧车库管理系统
  • 每日新闻掌握【2024年6月26日 星期三】
  • InVEST实践及在生态系统服务供需、固碳、城市热岛、论文写作等实际项目中应用
  • 慧科新闻搜索研究数据库的使用指南及个人获取途径
  • SpringBoot学习03-[Spring Boot与Web开发]
  • 数据恢复篇:如何恢复丢失的Android短信?
  • 数据结构历年考研真题对应知识点(栈)
  • BarTender版软件下载及安装教程
  • Python 中从字典中提取所有值到列表
  • Netty中Reactor线程的运行逻辑
  • liunx 搭建 zookeeper
  • selenium 3中等待方式
  • pytorch笔记:named_parameters
  • uniapp——H5添加支付宝授权登录,报错:系统异常,请联系商家。REDIRECT_URI_ILLEAGAL
  • 群辉NAS使用Kodi影视墙
  • 如何实现HPC数据传输的高效流转,降本增效?
  • redis 定时任务锁 分布式锁
  • 了解支付行业基本专业语
  • 408数据结构-图的应用1-最小生成树 自学知识点整理
  • Ubuntu18.04操作系统使用pip3安装open cv
  • 为什么变量不可以在 switch 语句中声明定义?
  • 手机定位技术全解析:原理、发展与应用