linux shell

关注公众号 jb51net

关闭
首页 > 脚本专栏 > linux shell > Linux  expect使用

Linux 命令expect使用详解

作者:阿龙先生啊

expect是由Don Libes基于Tcl语言开发的,是一种脚本语言,主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,本文给大家介绍Linux 命令expect使用详解,感兴趣的朋友一起看看吧

一、概述

1.1 命令简介

expect 是由Don Libes基于Tcl(Tool Command Language )语言开发的,是一种脚本语言,主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,可以将交互过程如:ssh登录,ftp登录等写在一个脚本上,使之自动化完成。尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率。

1.2 使用场景

(1)根据预定标准回答其问题,回答“是”、“否”或将控制权交还给您

(2)远程连接设备并执行自动化操作

(3)需要人机交互的地方,如果提前知道应该输入什么指令都可以使用expect 工具

1.3 expect命令安装

yum install expect  -y

二、expect使用原理

2.1 命令原理介绍

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

spawn命令

spawm命令就是用来启动新的进程的。spawn后的send和expect命令都是和spawn打开的进程进行交互的、

send命令

send命令接收一个字符串参数,并将该参数发送到进程,这个过程类似模拟人类输入密码

interact命令

结合spawn、expect、send自动化的完成很多任务,interact命令可以在适当的时候进行任务的干预,比如下载完ftp文件时,仍然可以停留在ftp命令行状态,以便手动的执行后续命令

三、expect使用语法

3.1 expect 启用选项

3.2 expect命令参数

四、实战案例

4.1 登录远程服务器并在远程服务器上执行命令

#!/usr/bin/expect
spawn ssh root@192.168.2.161 df -h
expect "*password:"
send "winner@001\n"
expect eof

执行结果如下图: 

4.2 本机免密实现

#! /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

4.3 自动生成kerberos用户的keytab认证文件

#! /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使用详解的文章就介绍到这了,更多相关Linux expect使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文