#注意:expect跟bash类似,使用时要先登录到expect,所以首行要指定使用expect
#在运行脚本时候要expect file,不能sh file了
#spawn是expect的语句,执行命令前都要加这句
#expect "password:"这句意思是交互获取是否返回password:关键字,因为在执行ssh时会返回输入password的提示:root@192.168.100.1's password:
#send就是将密码123123发送过去
#interact代表执行完留在远程控制台,不加这句执行完后返回本地控制台
#!/bin/expect
log_file /opt/jzgk_Expect.log
set user [lindex $argv 0]
set name [lindex $argv 1]
set passwd "123123"
set cm [lindex $argv 2]
set bash [lindex $argv 3]
spawn ssh $user@$name
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect "*#"
send "$cm $bash\r"
expect "*#"
send "exit\r"
#解:通过传递参数的方式执行交互式远程连接和调用shell脚本,并输出日志(Expect.log。)Expect.log可以络通的态看到网下为什么没有执行shell。
#通过shell调用以上expect脚本。以下是俩种写法:
#写法1:
#!/bin/bash
#同一网段IP循环执行相同的操作
for i in $(seq 135 250)
do
expect ssh.exp root 192.168.106.$i bash /tmp/1.sh
if [ $? = 0 ];then
echo -e `date` "192.168.106.$i: 执行成功" >>/opt/jzgk_Correct.log
else
echo -e `date` "192.168.106.$i: 执行失败\n" >>/opt/jzgk_Error.log
fi
done
#写法2:
#!/bin/bash
#不同IP网段循环执行相应的操作
cat iplist | while read a
do
expect ssh.exp root $a bash /tmp/1.sh
if [ $? = 0 ];then
echo -e `date` "$a: 执行成功" >>/opt/jzgk_Correct.log
else
echo -e `date` "$a: 执行失败\n" >>/opt/jzgk_Error.log
fi
done