expect自动应答

Posted the-day-of-the-wind

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了expect自动应答相关的知识,希望对你有一定的参考价值。

expect脚本
	1. expect简介
	expect是一个用来处理交互的命令。借助Expect,我们可以将交互过程写在一个脚本上,使之自动化完成。
	expect(自动应答)		基于TCL(Tool Command Language)语言演变而来
	
	expect中最关键的四个命令是:
	send:用于向进程发送字符串
	expect:从进程接收字符串
	spawn:启动新的进程
	interact:允许用户交互


	2. 安装expect
	# yum install expect -y

查看expect信息
[root@web1 sed]# rpm -qi expect
Name        : expect                       Relocations: (not relocatable)
Version     : 5.44.1.15                         Vendor: CentOS
Release     : 5.el6_4                       Build Date: Mon 04 Nov 2013 05:05:44 PM CST
Install Date: Sun 21 Aug 2016 11:48:49 PM CST      Build Host: c6b9.bsys.dev.centos.org
Group       : Development/Languages         Source RPM: expect-5.44.1.15-5.el6_4.src.rpm
Size        : 566637                           License: Public Domain
Signature   : RSA/SHA1, Mon 04 Nov 2013 07:53:54 PM CST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://expect.nist.gov/
Summary     : A program-script interaction and testing utility
Description :
Expect is a tcl application for automating and testing
interactive applications such as telnet, ftp, passwd, fsck,
rlogin, tip, etc. Expect makes it easy for a script to
control another program and interact with it.

This package contains expect and some scripts that use it.

	任何有交互性的操作,都可以用expect来做	

	3. expect使用详解
	#!/bin/bash

	expect <<EOF > /dev/null 2>&1    --/dev/null 代表把标准输出重定向输出到空洞,2>&1代表把出错输出也定向到标准输出。
	spawn passwd $1		--产生passwd $1这个命令
	expect "password:"		--当停在rd:结尾这个标识符时
	send "456
"		--我就把456传给它
	expect "password:"		--当再次停在rd:结尾这个标识符时
	send "456
"		--我就再次把456传给它
	expect eof			--表示expect结束
	EOF




	# sh 1.expect test    --执行方法,因为脚本里写的是$1,所以后面接你要修改密码的用户名
远程ssh

	#!/bin/bash

	sed -i ‘/^‘$1‘/d‘ /root/.ssh/known_hosts
	expect << EOF > /dev/null 2>&1
	spawn ssh $1
	expect "no)?"
	send "yes
"
	expect "password:"
	send "123456
"
	expect "]#"
	send "mkdir /root/Desktop/aa
"
	send "touch /root/Desktop/aa/$1
"
	send "exit
"
	expect eof
	EOF



	假设管理的机器有N台,密码也各不相同(没有ssh等效性),现在需要在每个机器上都创建一个文件

	# cat ip_user_passwd.txt 		--这个文件里包含你所有管理机器的IP,用户及其对应的密码
	10.1.1.63       root    oracle
	10.1.1.77       root    1234
	10.1.1.73       user1   123456
	10.1.1.85       root    54321
	......


	# cat 6.expect 
	#!/bin/bash

	cat ip_user_passwd.txt |while read ip user password 
	do
	sed -i ‘/^‘$ip‘/d‘ /root/.ssh/known_hosts
	expect <<EOF &> /dev/null
	spawn ssh $ip -l $user
	expect ")?"
	send "yes
"
	expect "rd:"
	send "$password
"
	expect "]#"
	send "touch /tmp/123
"		--这里可以修改你每次要在这些机器上做的命令
	send "exit
"
	expect eof
	EOF
	done

  

以上是关于expect自动应答的主要内容,如果未能解决你的问题,请参考以下文章

shell——随机数(RANDOM)+ expect 自动应答

shell之expect应答语句(用shell脚本实现获取批量主机存活信息)

shell之expect应答语句(用shell脚本实现获取批量主机存活信息)

shell之expect应答语句(用shell脚本实现获取批量主机存活信息)

linux12shell编程 --> expect

自动化运维脚本语言之expect实践学习