个人主页——个人主页 ✨
感谢点赞和关注 ,每天进步一点点!加油!
目录
一、概述
1.1 命令简介
1.2 使用场景
1.3 expect命令安装
二、expect使用原理
2.1 命令原理介绍
三、expect使用语法
3.1 expect 启用选项
3.2 .expect命令参数
四、实战案例
4.1 登录远程服务器并在远程服务器上执行命令
4.2 本机免密实现
4.3 自动生成kerberos用户的keytab认证文件
expect 是由Don Libes基于Tcl(Tool Command Language )语言开发的,是一种脚本语言,主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,可以将交互过程如:ssh登录,ftp登录等写在一个脚本上,使之自动化完成。尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率。
(1)根据预定标准回答其问题,回答“是”、“否”或将控制权交还给您
(2)远程连接设备并执行自动化操作
(3)需要人机交互的地方,如果提前知道应该输入什么指令都可以使用expect 工具
yum install expect -y
spawn启动指定进程—expect获取指定关键字—send向指定程序发送指定字符—执行完成退出
spawm命令就是用来启动新的进程的。spawn后的send和expect命令都是和spawn打开的进程进行交互的、
send命令接收一个字符串参数,并将该参数发送到进程,这个过程类似模拟人类输入密码
结合spawn、expect、send自动化的完成很多任务,interact命令可以在适当的时候进行任务的干预,比如下载完ftp文件时,仍然可以停留在ftp命令行状态,以便手动的执行后续命令
#!/usr/bin/expect
spawn ssh [email protected] df -h
expect "*password:"
send "winner@001\n"
expect eof
执行结果如下图:
#! /bin/bash
#
# Author: kangll
# CreateTime: 2023-11-10
# Desc: 基础环境配置,包括服务器设置,JDK,免密,kerberos配置
# 可扩展到批量操作
#
#set -x
BASEDIR=$(cd "$(dirname "$0")"; pwd)
# 加载配置
source $BASEDIR/config/global.sh
ssh_networkname=(windp-aio)
ssh_passwd=winner@#2023
########################
# 生成本地ssh公钥
########################
create_ssh_pub(){
echo "生成本地ssh公钥"
/usr/bin/expect << eof
# 设置捕获字符串后,期待回复的超时时间
set timeout 30
# 执行命令开启一个新的进程
spawn ssh-keygen -t rsa -b 1024
## 开始进连续捕获
expect {
".ssh/id_rsa)" { send "\n"; exp_continue }
"Overwrite (y/n)?" { send "y\n"; exp_continue }
"no passphrase):" { send "\n"; exp_continue }
"passphrase again:" { send "\n"; exp_continue }
}
eof
}
########################
# 定义复制ssh公钥方法
########################
copy_ssh(){
if [ ! -f /root/.ssh/id_rsa.pub ];then
create_ssh_pub
fi
echo "复制公钥到对应的主机上"
/usr/bin/expect << eof
# 设置捕获字符串后,期待回复的超时时间
set timeout 30
# 命令执行
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $1@$2
## 开始进连续捕获
expect {
"connecting (yes/no)?" { send "yes\n"; exp_continue }
"s password:" { send "${ssh_passwd}\n"; exp_continue }
}
eof
}
########################
# 配置免密
########################
config_ssh() {
# 主机遍历
for name in ${ssh_networkname[*]};do
timeout 5 ssh root@${name} "echo ${name}: 'This is success!'"
if [[ $? -ne 0 ]];then
echo "复制文件到: ${name}"
copy_ssh root ${name} > /dev/null
fi
done
echo "********** ssh installation completed **********"
}
# 配置root用户免密
config_ssh
#! /bin/bash
#
# Author: kangll
# CreateTime: 2023-11-10
# Desc: 基础环境配置,包括服务器设置,JDK,免密,kerberos配置
# 可扩展到批量操作
#
# public 主机名和root密码
ip=$(ip addr show | grep -E 'inet [0-9]' | awk '{print $2}' | awk -F '/' '{print $1}' | sed -n '$p')
ssh_hosts=${ip}
ssh_networkname=(windp-aio)
# global.sh 配置文件中获取
ssh_passwd=$root_passwd
ssh_passwd=winner@#2023
kerberos_user=winner_spark
##################################
# 配置kerberos用户: winner_spark
# 生成keytab 文件
##################################
config_kerberos_user() {
echo "******** 创建winner_spark用户实例 ********"
/usr/bin/expect << eof
# 设置捕获字符串后,期待回复的超时时间
set timeout 30
# 登录
spawn kadmin.local
## 开始进连续捕获,添加用户
expect {
"kadmin.local:" { send "addprinc ${kerberos_user}\n"; exp_continue }
"Enter password for principal" { send "${ssh_passwd}\n"; exp_continue }
"Re-enter password for principal" { send "${ssh_passwd}\n"; }
}
expect "kadmin.local:" { send "quit\r"; }
eof
echo "******** winner_spark用户生成keytab文件 ********"
/usr/bin/expect << eof
# 设置捕获字符串后,期待回复的超时时间
set timeout 30
spawn kadmin.local
## 开始进连续捕获,生成keytab file
expect {
"kadmin.local:" { send "xst -k /etc/security/keytabs/${kerberos_user}.keytab ${kerberos_user}@WINNER.COM\n"; }
}
expect "kadmin.local:" { send "quit\r"; }
eof
# modify keytab file privilege
chown ${kerberos_user}:hadoop /etc/security/keytabs/${kerberos_user}.keytab
echo "********** kerberos user winner_spark add completed **********"
}
# 配置kerberos,并启动
#config_krb5
# 配置kerberos用户: winner_spark, 生成keytab 文件
config_kerberos_user
————————————————
原文链接:Linux学习之expect操作详解_expect linux-CSDN博客
linux expect 详解-CSDN博客