使用场景:在centos7等Linux环境中
1、安装了docker,由于docker镜像和容器太多,导致系统空间长期报警,需要手动每次输入命令 执行。
2、部署前后端项目后,由于部署的目录和sh文件不同,每次均需要进入多个不同的目录下然后执行多个SH文件。
实现目标:使用expect工具,采用一个sh文件能够自动实现免交互进入root用户,执行命令,输入y,替换目录,执行sh文件,达到一键多个动作,实现一键式启动或部署。
目录
一、环境准备
假定用户已经完成了docker的安装、各种服务启动或创建的sh文件已经编辑完成。
二、安装expect
1、检查是否已经安装expect
(出现具体版本号视为已经安装)
[root@localhost config]# rpm -q expect
expect-5.45-14.el7_1.x86_64
2、安装expect
(安装完成后请执行1进行检查)
yum -y install expect
3、卸载expect
rpm -e expect
三、在目录下创建并编辑qidong.sh文件:
在预写入的目录下,用vi qidong.sh创建并按i进入编辑,输入如下内容后,按ESC然后切换模式,输入:wq 保存并退出vi。
备注:根据需要可以自行添加更多的执行,如复制文件,创建目录,删除文件或移动文件等执行命令,也可以直接curl、等操作。
#!/usr/bin/expect
#启动一个新的进程
spawn su root
#识别字样如果是password或者密码
expect "*password:*"
expect "*密码*"
#输入密码后执行回车
send "942971@Lxc\r"
#屏显空行
send_user "\n\n"
#屏显登录成功
send_user "登陆成功"
send_user "\n\n"
send_user "开始清理docker空余镜像"
#识别]字符
expect "]*"
#输入命令回车执行
send "docker system prune\r"
#识别y/n字符
expect "y/N"
#输入y回车确认
send "y\r"
send_user "\n\n"
send_user "清理docker空余镜像完毕"
send_user "\n\n"
expect "]*"
#输入指定目录然后回车执行
send "cd /home/lixiaochun/lxc347/\r"
expect "]*"
send "ls\r"
expect "]*"
send "cd /home/lixiaochun/lxc347/boot/\r"
expect "]*"
send "sh deploy.sh\r"
expect "]*"
send_user "全部执行完毕!!"
#等待用户交互
interact
四、expect执行qidng .sh文件
在qidong.sh文件所在目录下启动终端或者打开终端直接进入文件所在目录后,执行命令:expect qidong.sh,等待执行完成。
[lixiaochun@localhost lxc347]$ expect qidong.sh
spawn su root
密码:
登陆成功
开始清理docker空余镜像
[root@localhost lxc347]# docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all dangling build cache
Are you sure you want to continue? [y/N]
清理docker空余镜像完毕
y
cd /home/lixiaochun/lxc347/
Deleted build cache objects:
vyjmyoz2q87tu3fhwfzh9r5zs
zkmglguael4npiau96c2ryghn
0a613jzmdod5rybrlq4u48vkr
Total reclaimed space: 191.7MB
[root@localhost lxc347]# cd /home/lixiaochun/lxc347/
ls
[root@localhost lxc347]# ls
cd /home/lixiaochun/lxc347/boot/
boot datareport preview qingli.sh
ceshi.sh dockerqingli.sh qidong.sh scheduletask
[root@localhost lxc347]# cd /home/lixiaochun/lxc347/boot/
sh deploy.sh
[root@localhost boot]# sh deploy.sh
[+] Building 16.7s (7/7) FINISHED docker:default
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from dockerfile 0.0s
=> => transferring dockerfile: 249B 0.0s
=> [internal] load metadata for docker.io/library/openjdk:8 15.3s
=> [1/2] FROM docker.io/library/openjdk:8@sha256:8a9d5c43f540e8d0c003c72 0.0s
=> [internal] load build context 1.2s
=> => transferring context: 191.73MB 1.2s
=> CACHED [2/2] ADD jnpf-admin-3.4.7-RELEASE.jar boot.jar 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:b36c9094458897e8ccb0f3c02a352c349a7b7243fb6fb 0.0s
=> => naming to docker.io/library/lxc347admin:master_202309211246 0.0s
lxc347admin
lxc347admin
5d0a0e07ea1b4d38cb5e2f4cbc2281c88618476c7683edc8d825929d9cb42445
[root@localhost boot]#