人机交互命令 expect

6 篇文章 0 订阅

shell虽然很强大,但貌似无法完成人机交互命令的执行,比如 ssh host 若host与本机并未添加信任,则需要手动输入一次密码。这种情况可以用expect支持。


以下举个例子来说明expect的功能与使用:


功能:对集群各机器执行相同指令 如 集群ip 为 :192.168.6.1~192.168.6.10,需要在这10台机器上 同时 以tt用户登录 并执行 mkdir ttji_314命令;

首先 定义一个hostlist文件 :

192.168.6.1
192.168.6.2
192.168.6.3
192.168.6.4
192.168.6.5
192.168.6.6
192.168.6.7
192.168.6.8
192.168.6.9
192.168.6.10


然后定义一个 expect脚本 完成在单个机器执行命令:ssh_comm.sh

#!/usr/bin/expect				
set host [lindex $argv 0]
set command [lindex $argv 1]
set password 123456
set username tt
set timeout 1


send_user "connect to $host ...\n"
spawn ssh -l $username $host


expect "password:"
send "$password\r"


expect "#$"
send "$command\r"


expect "#$"
send "exit\r"


#interact
expect eof


几点说明 :

1 首行加上/usr/bin/expect

2 spawn: 后面加上需要执行的shell 命令
3 expect: 只有spawn 执行的命令结果才会被expect 捕捉到,因为spawn 会启
动一个进程,只有这个进程的相关信息才会被捕捉到,主要包括:标准输入的提
示信息,eof 和timeout。
4 send 和send_user:send 会将expect 脚本中需要的信息发送给spawn 启动
的那个进程,而send_user 只是回显用户发出的信息,类似于shell 中的echo 而
已。
5.set timeout 1之后的指令将都等待1s;

最后完成批量功能:command_all.sh
#!/bin/bash

function use() {
        echo "========================"
        echo "./command_all.sh hostlist command"
        echo "========================"
}



if [ $# != 2 ]
        then
                use
        else
                echo "welcome to use:\n"
fi

file=$1
command=$2

echo $file
echo $command

while read line
do
    #echo $line
    ./ssh_comm.sh $line "$command"
done < $file

使用:
./command_all.sh hostlist "mkdir ttji_314"

有个问题:当在expect脚本中 使用root用户登录的时候 似乎没有timeout这种概念 ,执行完命令立即返回;

而用普通用户才会有这种体现。

若有了解的同学请留言指教,不胜感激~害羞



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值