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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
No entry or manifest in @ali/alfa-aliyundotcom-free-widget-goods-card
Error: No entry or manifest in @ali/alfa-aliyundotcom-free-widget-goods-card
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:578343
    at h (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:379364)
    at Generator.<anonymous> (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:380687)
    at Generator.next (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:379774)
    at Pe (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:491844)
    at a (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:492048)
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:492109
    at new Promise (<anonymous>)
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:491988
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:578533
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
No entry or manifest in @ali/alfa-aliyundotcom-free-widget-goods-card
Error: No entry or manifest in @ali/alfa-aliyundotcom-free-widget-goods-card
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:578343
    at h (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:379364)
    at Generator.<anonymous> (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:380687)
    at Generator.next (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:379774)
    at Pe (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:491844)
    at a (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:492048)
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:492109
    at new Promise (<anonymous>)
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:491988
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:578533
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
No entry or manifest in @ali/alfa-aliyundotcom-free-widget-goods-card
Error: No entry or manifest in @ali/alfa-aliyundotcom-free-widget-goods-card
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:578343
    at h (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:379364)
    at Generator.<anonymous> (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:380687)
    at Generator.next (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:379774)
    at Pe (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:491844)
    at a (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:492048)
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:492109
    at new Promise (<anonymous>)
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:491988
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.50/scripts/articleDetail.js:1:578533
简介: 搞定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

五、小郑有话说

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

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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
打赏
0
0
0
0
4
分享
相关文章
|
3月前
|
自动化微信朋友圈:Python脚本实现自动发布动态
本文介绍如何使用Python脚本自动化发布微信朋友圈动态,节省手动输入的时间。主要依赖`pyautogui`、`time`、`pyperclip`等库,通过模拟鼠标和键盘操作实现自动发布。代码涵盖打开微信、定位朋友圈、准备输入框、模拟打字等功能。虽然该方法能提高效率,但需注意可能违反微信使用条款,存在风险。定期更新脚本以适应微信界面变化也很重要。
312 61
定期备份数据库:基于 Shell 脚本的自动化方案
本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。
|
1月前
|
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
115 32
UI-TARS:字节跳动开源专注于多平台 GUI 自动化交互的视觉语言模型
UI-TARS 是字节跳动推出的新一代原生图形用户界面(GUI)代理模型,支持跨平台自动化交互,具备强大的感知、推理、行动和记忆能力,能够通过自然语言指令完成复杂任务。
1126 16
UI-TARS:字节跳动开源专注于多平台 GUI 自动化交互的视觉语言模型
多种脚本批量下载 Docker 镜像:Shell、PowerShell、Node.js 和 C#
本项目提供多种脚本(Shell、PowerShell、Node.js 和 C#)用于批量下载 Docker 镜像。配置文件 `docker-images.txt` 列出需要下载的镜像及其标签。各脚本首先检查 Docker 是否安装,接着读取配置文件并逐行处理,跳过空行和注释行,提取镜像名称和标签,调用 `docker pull` 命令下载镜像,并输出下载结果。使用时需创建配置文件并运行相应脚本。C# 版本需安装 .NET 8 runtime。
129 2
AutoMouser:AI Chrome扩展程序,实时跟踪用户的浏览器操作,自动生成自动化操作脚本
AutoMouser是一款Chrome扩展程序,能够实时跟踪用户交互行为,并基于OpenAI的GPT模型自动生成Selenium测试代码,简化自动化测试流程。
216 17
AutoMouser:AI Chrome扩展程序,实时跟踪用户的浏览器操作,自动生成自动化操作脚本
CogAgent-9B:智谱 AI 开源 GLM-PC 的基座模型,专注于预测和执行 GUI 操作,可应用于自动化交互任务
CogAgent-9B 是智谱AI基于 GLM-4V-9B 训练的专用Agent任务模型,支持高分辨率图像处理和双语交互,能够预测并执行GUI操作,广泛应用于自动化任务。
167 12
CogAgent-9B:智谱 AI 开源 GLM-PC 的基座模型,专注于预测和执行 GUI 操作,可应用于自动化交互任务
AGUVIS:指导模型实现 GUI 自动化训练框架,结合视觉-语言模型进行训练,实现跨平台自主 GUI 交互
AGUVIS 是香港大学与 Salesforce 联合推出的纯视觉 GUI 自动化框架,能够在多种平台上实现自主 GUI 交互,结合显式规划和推理,提升复杂数字环境中的导航和交互能力。
162 8
AGUVIS:指导模型实现 GUI 自动化训练框架,结合视觉-语言模型进行训练,实现跨平台自主 GUI 交互
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
Midscene.js 是一款基于 AI 技术的 UI 自动化测试框架,通过自然语言交互简化测试流程,支持动作执行、数据查询和页面断言,提供可视化报告,适用于多种应用场景。
1072 1
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告

热门文章

最新文章