shell脚本:expect使用案例

expect是linux上的一种人机交互的一套工具,它里面的命令能完成数据的接受、发送以及新进程的启动

参数:
1、spawn:新建一个进程,这个进程的交互由expect控制
2、expect等待接收进程返回的字符串,直到超时时间,根据规则决定下一步操作
3、send发送字符串给expect控制的进程去执行
4、set设置变量为某个值
5、exp_continue:重新执行expect命令分支
6、expect eof 等待spawn进程结束后退出信号eof

 

shell 中套用expect脚本:

方法1:使用expect -c "expect语句"

方法二:/bin/expect <<-eof

    代码。。。。。。。

eof

案例一:使用方法一来进行批量主机执行某个命令

    一、主机ip文件

192.168.161.80 root 22 123456
192.168.161.90 root 22 123456
Color="echo -e \\033[31m"
End='\033[0m'
Host_list='/tmp/host_info.list'
Info=$*
[ ! -f "${Host_list}" ] || { echo "${Host_list} not exist" ; exit 1; }


for ip in $(awk '{print $1}' $Host_list)
do
        User=$(awk -v ii=$ip '$1==ii {print $2}' $Host_list)
        Port=$(awk -v ii=$ip '$1==ii {print $3}' $Host_list)
        Password=$(awk -v ii=$ip '$1==ii{print $4}' $Host_list)
        expect -c "
                spawn ssh -p $Port $User@$ip
                expect {
                        \"(yes/no)\" {send \"yes\r\" ;exp_continue}
                        \"password:\" {send \"$Password\r\" ;exp_continue}
                        \"$User@*\" {send \"$Info\r exit \r\";exp_continue} 
}
"
${Color}"---------------------------------------------------------------------------------"${End}
done

案例二:把ssh公钥传递给当前网段中所有存活主机

    

#定义用户密码
pass=123456
#清空文件
>/tmp/ip.txt
#查看是否安装了expect命令,如果没有安装则进行安装
rpm -q expect &>/dev/null
if [ $? -ne 0 ];then
	yum install expect -y
fi

#判断是否存在私钥,不存在密钥对则生成秘钥对
if [ ! -f ~/.ssh/id_rsa ];then
	ssh-keygen -f ~/.ssh/id_rsa -P ""
fi

#后台执行,判断存活的主机,存活则指向新文件
for i in {2..254}
do
	{
		ip=192.168.161.$i
		ping -W 2 -c 3 $ip &>/dev/null
		if [ $? -eq 0 ];then
			echo "$ip" >>/tmp/ip.txt
			/usr/bin/expect <<-eof
			spawn ssh-copy-id $ip
			expect {
			"yes/no" {send "yes\r" ;exp_continue}
			"password" {send "$pass\r"}

		}				
		expect eof
		eof
		fi

	}&
done

wait
echo "finish.............."
#备注:这种方式存在一定的不可行性, 生产中还是以案例一中存在的主机ip、用户、端口、密码这样去变量,比较适用。这里仅仅是提供一种expect的使用的方法

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值