shell脚本关于expect语言的使用
首先感谢社区大佬们的贡献,以下几个链接很好,建议收藏
1、Shell脚本切换root用户或获取root权限 https://blog.youkuaiyun.com/qq_41057885/article/details/123380174
2、Linux 在shell脚本中切换到root并执行命令 https://www.codeleading.com/article/40314762786/
3、 Linux expect 介绍和用法一 https://www.cnblogs.com/saneri/p/10819348.html
linux expect介绍及用法 https://blog.youkuaiyun.com/qq_38125626/article/details/112506796
4、shell脚本实战-expect语言的使用 https://blog.youkuaiyun.com/xinshuzhan/article/details/108017217
5、关于spawn https://blog.youkuaiyun.com/weixin_33757911/article/details/93123614
6、 如何向expect脚本里面传递参数 https://blog.youkuaiyun.com/qq_26502245/article/details/117068576
7、Linux 查看系统现存所有用户命令 https://www.jaagool.com/article/1584162938803
1. 首先关于expect我的了解, expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了,expect就是一套用来实现自动交互功能的软件。主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
- expect自动交互流程:
1、spawn启动指定进程;
2、expect获取指定关键字
3、send向指定程序发送指定字符
4、执行完成退出.
注意该脚本能够执行的前提是安装了expect
常用命令–
spawn 交互程序开始后面跟命令或者指定程序
expect 获取匹配信息匹配成功则执行expect后面的程序动作
send exp_send 用于发送指定的字符串信息
exp_continue 在expect中多次匹配就需要用到
send_user 用来打印输出 相当于shell中的echo
exit 退出expect脚本
eof expect执行结束 退出
set 定义变量
puts 输出变量
set timeout 设置超时时间
2. 为什么要是用expect?
最近在做项目有个需求,一个非root用户需要修改linux系统的环境变量,比如时钟,date -s 以及hwclock -w 或clock -w这些指令都是不能直接执行的,最后才选择expect。
3、使用步骤
- 3.1 先须安装expect
yum install -y expect
- 3.2 编写脚本( 我的脚本文件是 switchRoot.sh ,建议后缀是.exp)
#!/usr/bin/expect
## 只有先进入expect环境后才可执行spawn
## 不论是在此脚本内自动输入密码还是在脚本外手工输入密码,至少要等待1秒
set timeout 1
## 切换root用户
spawn su root
## 等待输入密码
expect "password for"
## 若有则立即返回,否则就等待一段时间后返回,等待时长就是开头设置的1秒
##expect "password:"
## 向上面的进程(su kevin)发送字符串中的密码, 并且自动敲Enter健(\r)
###接收变量
set pass [lindex $argv 0]
##输入变量
send "$pass\n"
set parm1 [lindex $argv 1]
## 进入目录
send "cd /home/cloud/\n"
## 执行目标文件
send "./Test.sh $parm1\n"
##退出expect
expect eof
- 3.3 Test.sh脚本(注意切换非root用户,发现单独执行hwclock -w没有权限)
#!/bin/bash
##当前用户
whoami
## 打印传递的变量
echo "$1"
hwclock -w
echo "------------ end."
echo '0'
- 3.4 执行脚本
./switchRoot.sh 'root用户密码' '参数2'