Linux expect命令
Linux expect命令
在Linux系统中,expect 是一款非常有用的工具,它允许用户自动化与需要用户输入进行交互的程序。
expect自动交互流程:
spawn启动指定进程---expect获取指定关键字---send向指定程序发送指定字符---执行完成退出.
使用场景
- 自动化登录和操作远程服务器
通过 ssh 登录远程服务器,自动输入密码,执行命令,并退出。这对于需要定期执行的任务或远程服务器的自动化管理非常有用。
2. 安装和配置软件
在安装过程中,有些软件可能需要用户输入配置信息,例如数据库密码、管理员用户名等。使用 expect 可以自动填写这些信息,使软件安装过程自动化。
3. 交互式脚本
创建交互式脚本,可以与用户进行动态的、基于输入的交互。这对于向用户提供命令行工具的友好界面很有用。
4. 自动化测试
在测试环境中,expect 可以用于自动化测试,模拟用户的输入和操作。这有助于确保程序在各种情况下的正确性。
5. 文件传输
使用 scp 进行文件传输时,如果需要密码,expect 可以自动提供密码,从而实现脚本化的文件传输。
6. 自动化配置工具
与配置管理工具结合使用,可以编写 expect 脚本以在大规模环境中自动配置系统参数、安装软件或进行其他配置任务。
7. 处理交互式命令行工具
与一些需要用户输入的命令行工具(如配置工具、安装程序等)交互时,expect 可以自动完成交互过程。
安装方式
YUM
[root@localhost ~]# yum install -y expect
RPM
1.百度网盘
链接:https://pan.baidu.com/s/1wzditaRQsT8IaxjNPh6SKw?pwd=n441
提取码:n441
2.蓝奏云
https://wweu.lanzouh.com/b00tatk4ba
密码:1z97
#将两个文件上传到这个目录
[root@localhost ~]# mkdir /rpm
[root@localhost rpm]# ll /rpm/
总用量 2200
-rw-r--r-- 1 root root 268656 6月 24 2015 expect-5.45-14.el7_1.x86_64.rpm
-rw-r--r-- 1 root root 1980564 11月 25 2015 tcl-8.5.13-8.el7.x86_64.rpm
[root@localhost rpm]# rpm -ivh *
准备中... ################################# [100%]
正在升级/安装...
1:tcl-1:8.5.13-8.el7 ################################# [ 50%]
2:expect-5.45-14.el7_1 ################################# [100%]
[root@localhost rpm]# expect -v
expect version 5.45
用法--前提准备
1.编写IP.conf文件
[root@localhost ~]# more IP.conf
#[DB]
DB-IP=192.168.8.160
DB-system-user=root
DB-system-passwd=admin
DB-port=1521
#[zookeeper]
ZK-IP=192.168.8.161
ZK-system-user=root
ZK-system-passwd=admin
ZK-port=2181
ZK-passwd=
#[MGR]
MGR-IP=192.168.8.163
MGR-system-user=root
MGR-system-passwd=admin
2.编写shell脚本
[root@localhost ~]# more 2.sh
#!/bin/bash
# 脚本功能:从配置文件读取目标机器信息,将本地文件传输到远程服务器的指定目录
# 参数:
# $1: 本地文件路径
# $2: 目标配置名称 (例如: DB 或 ZK)
# $3: 目标目录
# 检查参数是否完整
if [ $# -ne 3 ]; then
echo "用法: $0 <本地文件路径> <目标配置总名称cat IP.conf> <将源端文件传送到目标端的哪个路径?>"
exit 1
fi
# 提取参数
LOCAL_FILE=$1
CONFIG_NAME=$2
REMOTE_DIR=$3
# 配置文件路径
CONFIG_FILE="IP.conf"
# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
echo "配置文件 $CONFIG_FILE 不存在!"
exit 1
fi
# 从配置文件读取目标机器的信息
REMOTE_IP=$(grep "^${CONFIG_NAME}-IP" $CONFIG_FILE | cut -d'=' -f2)
REMOTE_USER=$(grep "^${CONFIG_NAME}-system-user" $CONFIG_FILE | cut -d'=' -f2)
REMOTE_PASSWD=$(grep "^${CONFIG_NAME}-system-passwd" $CONFIG_FILE | cut -d'=' -f2)
# 检查是否成功读取配置
if [ -z "$REMOTE_IP" ] || [ -z "$REMOTE_USER" ] || [ -z "$REMOTE_PASSWD" ]; then
echo "无法从配置文件中读取 $CONFIG_NAME 的相关信息!"
exit 1
fi
# 提示用户将要传输的文件
echo "正在将文件 $LOCAL_FILE 传输到 ${REMOTE_USER}@${REMOTE_IP}:${REMOTE_DIR}"
# 使用expect自动输入密码并传输文件
expect << EOF
spawn scp $LOCAL_FILE ${REMOTE_USER}@${REMOTE_IP}:${REMOTE_DIR}
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "$REMOTE_PASSWD\r" }
}
expect eof
EOF
# 检查scp命令的执行结果
if [ $? -eq 0 ]; then
echo "文件传输成功!"
else
echo "文件传输失败!"
fi
[root@localhost ~]#
例如:将本地文件传送到目标机器
#例如:我将本地/root/1.sh文件传送到ZK机器的/root/目录下
[root@localhost ~]# ./2.sh 1.sh ZK /root/
正在将文件 1.sh 传输到 root@192.168.8.161:/root/
spawn scp 1.sh root@192.168.8.161:/root/
root@192.168.8.161's password:
1.sh 100% 2701 3.0MB/s 00:00
文件传输成功!
[root@localhost ~]#
#ZK机器查看/root/目录
[root@localhost ~]# ll /root/
总用量 12
-rwxr-xr-x 1 root root 2701 8月 15 17:09 1.sh
-rw-------. 1 root root 1778 8月 5 15:13 anaconda-ks.cfg
-rwxr-xr-x. 1 root root 506 8月 5 15:17 run.sh
[root@localhost ~]#
本文作者:谢墨尘
本文链接:https://www.cnblogs.com/xietingfeng321/p/18361421
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步