搞定shell脚本expect自动化交互输入密码等就是这么简单

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 搞定shell脚本expect自动化交互输入密码等就是这么简单


一、问题

因为我把Mysql和Redis都是安装在了docker中(我本机是Linux系统,然后本机中安装了docker),每次开机都是先启动docker,然后输入密码,很麻烦

因为root权限是最高的,咱们不能拿root直接使用,不然操作失误之后,造成的损失可想而知(例如:一不小心用root执行了一个:\rm -r /)。

然后你可能:

但是

面对这种让你输入密码的情况,真的很烦

每次启动都是输入密码:

每次停止也是输入密码:

就研究了一下,有什么办法可以自动输入密码,交换式自动输入密码的方法,本文就是来说明这个的。

二、有请expect闪亮登场

(一)自我介绍:

使用 man expect查看说明书

expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信

INTRODUCTION
       Expect  is  a program that "talks" to other interactive programs according to a script.  Fol‐
       lowing the script, Expect knows what can be expected from a  program  and  what  the  correct
       response should be.  An interpreted language provides branching and high-level control struc‐
       tures to direct the dialogue.  In addition, the user can take control and  interact  directly
       when desired, afterward returning control to the script.
       Expectk  is  a  mixture of Expect and Tk.  It behaves just like Expect and Tk's wish.  Expect
       can also be used directly in C or C++ (that is, without Tcl).  See libexpect(3).
       The name "Expect" comes from the idea of send/expect sequences popularized  by  uucp,  kermit
       and  other modem control programs.  However unlike uucp, Expect is generalized so that it can
       be run as a user-level command with any program and task in mind.  Expect can  actually  talk
       to several programs at the same time.

(二)expect自动交互流程

spawn启动指定进程--->expect获取指定关键字--->send向指定程序发送指定字符--->执行完成退出.

(三)expect常用命令解释

spawn : 交互程序开始后面跟命令或者指定程序

expect : 获取匹配信息匹配成功则执行expect后面的程序动作

send exp_send : 用于发送指定的字符串信息

exp_continue : 在expect中多次匹配就需要用到

send_user : 用来打印输出 相当于shell中的echo

exit : 退出expect脚本

eof : expect执行结束 退出

set :定义变量

puts :输出变量

set timeout : 设置超时时间

(四)实战脚本训练

创建一个新的脚本文件:

truedei@truedei:~$ 
truedei@truedei:~$ 
truedei@truedei:~$ vim sd

输入:

注意,第一行很重要,通常我们的脚本里第一行是#!/bin/bash,而这里是你机器上expect程序的路径,说明这段脚本是由expect来解释执行的,而不是由bash解释执行,所以代码的语法和shell脚本也是不一样的。其中set是设置变量,spawn是执行的命令。

#!/usr/bin/expect
#设置超时时间
set timeout 30
#执行需要执行的命令
spawn sudo docker start mysql57
#设置超时时间
set timeout 1000
#发送密码
send "1\r"
#结束退出程序
expect eof

给脚本设置可执行权限:

truedei@truedei:~$ 
truedei@truedei:~$ chmod 777 sd
truedei@truedei:~$ 
truedei@truedei:~$ cat sd
#!/usr/bin/expect
set timeout 30 
#执行需要执行的命令
spawn sudo docker start mysql57
set timeout 1000  
#发送密码
send "1\r"
expect eof
truedei@truedei:~$ 
truedei@truedei:~$ ./sd
spawn sudo docker start mysql57
1
[sudo] truedei 的密码:
mysql57
truedei@truedei:~$

可以看到已经执行了:

truedei@truedei:~$ sudo docker ps 
[sudo] truedei 的密码:
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
0a122a08125f        mysql:5.7.29        "docker-entrypoint.s…"   5 weeks ago         Up 3 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp   mysql57
truedei@truedei:~$ 
truedei@truedei:~$

使用另一种办法,使用代码块的方式:

现在把命令,修改成停止的;

其实expect提供的是和终端的一种交互机制,输入密码只是其中一种应用形式,只要是在终端阻塞需要输入时,都可以通过expect脚本完成自动输入,比如前面脚本里配置了两种交互场景,一种是终端提示"password:"时输入密码;还要一种是提示你输入yes或者no;

因为我是中文的提示符,所以提示的是密码,所以我捕捉密码.

truedei@truedei:~$ cat sd
#!/usr/bin/expect
set timeout 30 
#执行需要执行的命令
spawn sudo docker stop mysql57
expect {
  "*密码*" { send "1\r" }
}
expect eof
truedei@truedei:~$

执行:

可以看到已经停止了,大多数都是采用这种代码块形式来写的

truedei@truedei:~$ ./sd
spawn sudo docker stop mysql57
[sudo] truedei 的密码:
mysql57
truedei@truedei:~$ 
truedei@truedei:~$ 
truedei@truedei:~$ sudo docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
truedei@truedei:~$ 
truedei@truedei:~$

三、升级脚本

(一)启动脚本:

truedei@truedei:~$ 
truedei@truedei:~$ cat startDockerAll 
#!/usr/bin/expect
set timeout 30 
#设置密码
set password 1
#执行需要执行的命令
spawn sudo docker start mysql57
expect {
  "*密码*" { send "$password\r" }
}
spawn sudo docker start redis
expect {
  "*密码*" { send "$password\r" }
}
expect eof
truedei@truedei:~$ 
truedei@truedei:~$

(二)停止脚本

truedei@truedei:~$ 
truedei@truedei:~$ cat stopDockerAll 
#!/usr/bin/expect
set timeout 30 
#设置密码
set password 1
#执行需要执行的命令
spawn sudo docker stop mysql57
expect {
  "*密码*" { send "$password\r" }
}
spawn sudo docker stop redis
expect {
  "*密码*" { send "$password\r" }
}
expect eof
truedei@truedei:~$ 
truedei@truedei:~$

四、成果

测试启动

truedei@truedei:~$ 
truedei@truedei:~$ ./startDockerAll 
spawn sudo docker start mysql57
[sudo] truedei 的密码:spawn sudo docker start redis
[sudo] truedei 的密码:
redis
truedei@truedei:~$ 
truedei@truedei:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
85cb7d83a2ff        redis               "docker-entrypoint.s…"   24 hours ago        Up 4 seconds        0.0.0.0:6379->6379/tcp              redis
0a122a08125f        mysql:5.7.29        "docker-entrypoint.s…"   5 weeks ago         Up 4 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp   mysql57
truedei@truedei:~$ 
truedei@truedei:~$

测试停止

truedei@truedei:~$ ./stopDockerAll 
spawn sudo docker stop mysql57
[sudo] truedei 的密码:spawn sudo docker stop redis
[sudo] truedei 的密码:
redis
truedei@truedei:~$ 
truedei@truedei:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
truedei@truedei:~$

感谢下文博主的删库跑路的图片:

https://www.sohu.com/a/255496462_100021113

感谢这位大神的相关介绍:

https://www.cnblogs.com/saneri/p/10819348.html

五、小郑有话说

如果对你有帮助,可以分享给你身边的朋友。或者给俺点个大大的赞和大大的评论,点赞和评论就是给我最大的支持,感谢。

水平有限,难免会有疏漏或者书写不合理的地方,欢迎交流讨论。

目录
相关文章
|
11天前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
194 9
|
11天前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
67 2
|
1月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
4月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
205 60
|
3月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
230 1
|
2月前
|
传感器 人工智能 JavaScript
Playwright实战:写UI自动化脚本,速度直接起飞
简介: 测试工程师老王因UI自动化问题深夜奋战,反映出传统测试工具的局限性。微软开源的Playwright凭借智能等待、跨域操作、移动端模拟与网络拦截等强大功能,正迅速取代Selenium,成为新一代自动化测试标准。其稳定高效的设计显著降低维护成本,助力企业构建高质量测试流程。
|
4月前
|
机器学习/深度学习 Kubernetes 监控
Kubernetes 节点故障自愈方案:结合 Node Problem Detector 与自动化脚本
本文深入探讨了Kubernetes节点故障自愈方案,结合Node Problem Detector(NPD)与自动化脚本,提供技术细节、完整代码示例及实战验证。文章分析了硬件、系统和内核层面的典型故障场景,指出现有监控体系的局限性,并提出基于NPD的实时事件捕获与自动化诊断树的改进方案。通过深度集成NPD、设计自动化修复引擎以及展示内核死锁恢复的实战案例,文章详细说明了自愈流程的实现步骤与性能优势。此外,还提供了生产环境部署指南、高可用架构设计及安全防护措施,并展望了机器学习增强故障预测和混沌工程验证的进阶优化方向。全文约1.2万字,适合希望提升Kubernetes集群稳定性的技术人员阅读。
150 1
|
5月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
111 17
|
5月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
129 4
|
5月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
273 3