expect免交互

server/2024/12/1 23:29:29/

文章目录

  • 交互
    • 1 概述
      • 1.1 格式
      • 1.2 变量配置
    • 2 expect语句
      • 2.1 转义符
      • 2.2 expect的语法
        • 2.2.1 用例
        • 2.2.2 嵌入模式
        • 2.2.3 通过免交互实现ssh远程连接目标主机
        • 2.2.4 用嵌套实现免交互的用fdisk对磁盘进行分区,创建文件系统,并挂载(sed 实现永久挂载)

交互

1 概述

交互:当我们使用程序时,需要进入程序发出对应的指令,然后程序做出对应的执行结果。

交互:I/O重定向,通过这种方式把指令提交给程序,程序运行指令。

文本免交互:Here Document

1.1 格式

命令 << 标记内容标记# 1、标记为可以是任意合法字符(EOF作为标记)
# 2、结尾的标记一定要顶格写,前面不能有空格,也不能有任何其他字符

例:

passwd kc << EOF
> 123
> 123
EOF

1.2 变量配置

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的输入内容可以直接赋值给变量var="study make me happy!"
myvar=$(cat << 'EOF'
# 在开头的标记位使用单引号,外部的变量就不会被免交互内部使用
today is monday!
sun is good
$var
EOF
)#去掉每行之前的tab键
# -可以自动抑制tab键的空格
cat >> test.sh << -EOF
xy104
xy105
EOF

2 expect语句

建立在tcl(类c语言)的一个工具,可以用来对程序进行自动化控制和测试。可以用来解决shell脚本中交互的问题。

使用expect需要安装

apt -y install expect

2.1 转义符

  • \n:换行
  • \t:制表符(tab键)
  • \r:表示回车键
  • \b:表示退格键(backspace)

2.2 expect的语法

whereis expectexpect: /usr/bin/expect /usr/share/man/man1/expect.1.gz
  • #!/usr/bin/expect 开头必须声明使用的解释器

  • 使用expect的脚本不可以使用bash编译,必须赋权执行(./)

2.2.1 用例
#!/usr/bin/expect
#必须先声明解释器
set timeout 5
#定义超时时间,5秒到了,进程直接结束,默认超时时间是10秒spawn passwd dn
#spawn表示开启一个会话,监控一个命令的执行过程,跟踪后续的交互信息
expect "新的密码:"
#开启捕获,匹配到需要输入的内容行
send "123abcd\r"
#send 用来模拟用户的输入过程
expect "重新输入新的密码:"
send "123abcd\r"
#expect的结束语句(2种):
expect eof
#当交互结束之后,退回到上一次的用户,也就是spawn开始执行的用户是谁,就退回到谁
interact
#当交互结束之后,留在当前用户不变#!/usr/bin/expect
set timeout 5
#在脚本外传参
set username [lindex $argv 0]
#相当于shell脚本的位置变量
#set username kc 相当于shell中的 username=kc
set password [lindex $argv 1]
#set可以作为设置变量名(expect)
spawn su - $username
expect "密码"
send "$password\r"
expect "#"
send_user "ok"
#send_user相当于echo,打印指定内容
interact
2.2.2 嵌入模式

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

嵌套直接使用bash即可执行

#!/bin/bash
user=$1
password=$2
useradd -m -s /bin/bash $user
#开始使用嵌套,执行免交互
/usr/bin/expect <<-EOF
spawn passwd $user
expect "新的*"
send "${password}\r"
expect "重新*"
send "${password}\r"
expect eof
EOF
2.2.3 通过免交互实现ssh远程连接目标主机
#!/usr/bin/expect
set timeout 5
set hostname [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh $hostname
expect {"password:" {send "$password
"; exp_continue}"Permission denied,*" {send_user "访问拒绝
"}"No route to host" {send_user "主机名/IP地址有误
"}"yes/no" {send "yes
"; exp_continue}"password:" {send "$password
"}
}
expect eof
2.2.4 用嵌套实现免交互的用fdisk对磁盘进行分区,创建文件系统,并挂载(sed 实现永久挂载)
#!/bin/bash
apt -y install expect
apt -y install xfsprogs
echo 'for i in {0..32}           
do
echo "- - -" > /sys/class/scsi_host/host${i}/scan
done' > /opt/disk.sh
chmod +x /opt/disk.sh
echo "正在刷新磁盘,请稍等.........."
/opt/disk.sh
echo "磁盘已刷新完毕!"/usr/bin/expect <<EOF
set timeout 60
spawn fdisk /dev/sdb
expect "命令(输入 m 获取帮助)" 
send "n\r"
expect "选择 (默认 p)" 
send "\r"
expect "分区号" 
send "\r"
expect "第一个扇区"
send "\r"
expect "Last sector" 
send "+5G\r"
expect "命令(输入 m 获取帮助)" 
send "n\r"
expect "选择 (默认 p)" 
send "\r"
expect "分区号" 
send "\r"
expect "第一个扇区"
send "\r"
expect "Last sector" 
send "+5G\r"
expect "命令(输入 m 获取帮助)" 
send "n\r"
expect "选择 (默认 p)" 
send "\r"
expect "分区号" 
send "\r"
expect "第一个扇区"
send "\r"
expect "Last sector" 
send "+5G\r"
expect "命令(输入 m 获取帮助)"
send "n\r"
expect "选择 (默认 e)" 
send "\r"
expect "第一个扇区" 
send "\r"
expect "Last sector" 
send "\r"
expect "命令(输入 m 获取帮助)" 
send "n\r"
expect "第一个扇区" 
send "\r"
expect "Last sector" 
send "\r"
expect "命令(输入 m 获取帮助)" 
send "w\r"
expect eof
EOFpartprobemkfs.xfs /dev/sdb1
mkfs.xfs /dev/sdb2
mkfs.xfs /dev/sdb3
mkfs.xfs /dev/sdb5
mkdir /mnt/sdb{1..5}sed -i '$a /dev/sdb1 /mnt/sdb1 xfs defaults 0 0' /etc/fstab
sed -i '$a /dev/sdb2 /mnt/sdb2 xfs defaults 0 0' /etc/fstab
sed -i '$a /dev/sdb3 /mnt/sdb3 xfs defaults 0 0' /etc/fstab
sed -i '$a /dev/sdb5 /mnt/sdb5 xfs defaults 0 0' /etc/fstabmount -a
echo "磁盘分区已完成并挂载!"
df -hT | sed -n '1p;/sdb/p'

http://www.ppmy.cn/server/146563.html

相关文章

mysql集群NDB方式部署

1. 基本信息 部署机器角色部署路径192.168.0.1管理节点部署目录: /alidata1/mysql-cluster-8.4.3192.168.0.2管理节点192.168.0.3数据/SQL节点数据目录:192.168.0.4数据/SQL节点/alidata1/mysql-cluster-8.4.3/data/ndb-mgmd192.168.0.5数据节点 – 新增/alidata1/mysql-clust…

架构04-透明多级分流系统

零、文章目录 架构04-透明多级分流系统 1、透明多级分流系统 &#xff08;1&#xff09;概述 **定义&#xff1a;**透明多级分流系统是指在用户请求从客户端发出到最终查询或修改数据库信息的过程中&#xff0c;通过多个技术部件对流量进行合理分配&#xff0c;以提高系统的…

Oracle, PostgreSQL 字符串排序不一致及调整

有一个使用了不同数据库的应&#xff0c;Oracle 和 PostgreSQL&#xff0c;数据库中的记录完全相同&#xff0c;相同的查询语句(相同的排序&#xff0c;至少从字面上来说是的)取到的记录排序却不同&#xff0c;从而产生了 Bug。 简单演示一下默认排序各自在这两种数据库中的行为…

Gstreamer中,appsink、appsrc、fakesink与第三方交互

gstreamer中,有多种方式和第三方交互,其中比较推荐的有appsink、appsrc,其实还有fakesink。 appsink和appsrc即可以成对使用,也可以单独使用。appsink和fakesink用于将gst管道的数据发送出去,appsrc可以接收数据。类似opencv那种,做了封装,可以运行gst管道,可以直接运行…

llamaindex实战-ChatEngine-ReAct Agent模式

概述 ReAct 是一种基于Agent的聊天模式&#xff0c;构建在数据查询引擎之上。对于每次聊天交互&#xff0c;代理都会进入一个 ReAct 循环&#xff1a; 首先决定是否使用查询引擎工具并提出适当的输入 &#xff08;可选&#xff09;使用查询引擎工具并观察其输出 决定是否重复…

曲面单值化定理

曲面单值化定理&#xff08;Uniformization Theorem&#xff09;是复分析、几何和拓扑学中的一个重要结果。它为紧致黎曼曲面提供了标准化的几何结构&#xff0c;是研究复几何和代数几何的基础。以下是对曲面单值化定理的详细介绍以及其应用场景。 曲面单值化定理的陈述 基本版…

Python 异步编程:await 与 create_task 的比较与选择

Python 异步编程&#xff1a;await 与 create_task 的比较与选择 1. await 直接调用协程示例代码特点 2. await create_task(async 函数)示例代码特点 3. 区别与优劣并发性控制流适用场景 4. 示例代码5. 总结 在 Python 的异步编程中&#xff0c;await 和 asyncio.create_task(…

TorchMoji使用教程/环境配置(2024)

TorchMoji使用教程/环境配置&#xff08;2024&#xff09; TorchMoji简介 这是一个基于pytorch库&#xff0c;用于将文本分类成不同的多种emoji表情的库&#xff0c;适用于文本的情感分析 配置流程 从Anaconda官网根据提示安装conda git拉取TorchMoji git clone https://gi…