无人扶我青云志,我自踏雪至山巅。|

谢墨尘

园龄:11个月粉丝:4关注:0

Linux expect命令

Linux expect命令

​ 在Linux系统中,expect 是一款非常有用的工具,它允许用户自动化与需要用户输入进行交互的程序。

expect自动交互流程:

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

使用场景

  1. 自动化登录和操作远程服务器

通过 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 中国大陆许可协议进行许可。

posted @   谢墨尘  阅读(326)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起