expect使用与安装
Linux expect详解
expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了,expect就是一套用来实现自动交互功能的软件。
expect 安装
1.yum安装
yum install -y expect
2.源码安装
源码安装前需要安装依赖,所以先安装unzip和gcc
yum install -y gcc unzip
源码安装前我们需要下载两个源码包,tcl源码包和expect源码包
下载tcl源码包
cd /tmp &&wget http://core.tcl.tk/tcl/zip/release/tcl.zip
下载expect源码包
wget https://jaist.dl.sourceforge.net/project/expect/Expect/5.45.3/expect5.45.3.tar.gz
需要先编译安装tcl,因为expect包依赖于tcl。
解压压缩包并编译安装tcl
unzip tcl.zip && cd ./tcl/unix
./configure && make && make install
解压压缩包并编译安装expect.
cd /tmp && tar -xzvf expect5.45.3.tar.gz && cd expect5.45.3/
./configure && make && make install
检查是否安装好,查看到版本号就已经安装好了
expect -v
expect使用
使用参数:
- -c:执行脚本前先执行的命令,可多次使用。
- -d:debug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似。
- -D:启用交换调式器,可设一整数参数。
- -f:从文件读取命令,仅用于使用#!时。如果文件名为"-",则从stdin读取(使用"./-"从文件名为-的文件读取)。
- -i:交互式输入命令,使用"exit"或"EOF"退出输入状态。
- –:标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!行:#!/usr/bin/expect --。
- -v:显示expect版本信息。
常用命令:
- spawn shell命令
# spawn ssh root@x.x.x.x
# spawn是expect内部命令,开启ssh连接 - expect 提示信息
- send
举例说明:
给user10修改密码:
#!/usr/bin/expect
spawn passwd user10
expect "New password:"
send "redhat\n"
expect "Retype new password:"
send "redhat\n"
expect eof
给多个服务器配置免密登录:
#! /bin/bash
current_path=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
# 在本地生成密钥对
if [ ! -e ~/.ssh/id_rsa ] || [ ! -e ~/.ssh/id_rsa.pub ]; then
mkdir /ssh_bak &> /dev/null
mv ~/.ssh /ssh_bak/.ssh-`date +%F-%T` &> /dev/null
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa &> /dev/null
fi
while read line
do
sed -ir "/$line/d" ~/.ssh/known_hosts &> /dev/null
/usr/bin/expect << EOF
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$line
expect "(yes/no)?"
send "yes\r"
expect "password:"
send "$1\r"
expect eof
EOF
done < $current_path/ip.txt