1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| #!/usr/bin/expect
# 导入 Expect 类库
set hostname [lindex $argv 0]
# 设置操作的远程主机,$argv 类似 Shell 函数中的接收参数 [lindex $argv 0]
# 则表示第一个接收参数 , 例如 expectExample.sh host1
set username [lindex $argv 1]
# 同上,第二个接收参数为登陆用户名
set passwd [lindex $argv 2]
# 同上,第三个接收参数为登陆用户密码
set timeout 60
# 设置等待超时为 60 秒
spawn ssh $username@$hostname
# 使用 spawn 命令来激活 ssh 程序,模拟终端的输出将能够被 Expect 所读取,模拟终端也能从 send 输入到远程主机
expect {
"yes/no" {send "yes ";exp_continue}
"Password:" {send "$passwd ";}
}
#Expect 语句等待远程主机的字符串匹配,当匹配到了“yes/no”
#则执行后面的操作 .expect 搜索模式"*password:",其中 * 允许匹配
# 任意输入,所以对于避免指定所有细节而言是非常有效的。如果远程主机没有 action,
#所以 Expect 检测到该模式后就继续运行。 一旦接收到提示后,下一行就就把密码送给当前进程。
send "sudo -s\r"
expect "Password:" {send "$newpasswd\r"}
# 执行 sudo 用户角色转换操作
send "copy /etc/sudoers /usr/local/etcsudoers\r"
# 执行实际运维操作
send "exit\r "
send "exit\r "
expect eof {exit 1}
|