Shell脚本基础篇——Expect免交互工具
本次博客结构
Expect概述expect是一款自动化的脚本解释型的工具。它基于tcl脚本,其运行需要tcl的支持。expect对一些需要交互输入的命令很有帮助,比如ssh ftp scp telnet。 在远程登录linux服务器的时候,ssh命令需要手工输入密码,当登录多台机器的时候就会非常繁琐。expect就可以根据设定的规则,自动帮我们输入密码,大大节省了时间。 Expect安装方法通常系统中不会安装expect,需要手动进行安装 系统为Centos时:
Expect基本命令
Expect执行方式分为两种主要执行方式:直接在expect解释器中进行执行、结合“<<”下一位的分界符进行嵌入执行。 直接执行[[email?protected]~]#more a.sh #!/usr/bin/expect //导入expect解释器 set timeout 20 //20秒超时时间 set hostname [lindex $argv 0] //追加参数0,加载第1位置 set password [lindex $argv 1] //追加参数1,加载第2位置 spawn ssh [email?protected]$hostname expect { "(yes/no)" //捕获关键字 {send"yes/r";exp_continue} //输入yes,继续下一步 "*password" //参数2 {send"$passwordr"} //模拟人工输入 } interact //交回控制权回终端 嵌入执行这里解释一下“<<”的用法: ? 当shell看到“<<”的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。这个分界符可以是你所定义的任何字符串。 “EOF”与“-EOF”两种分界符的不同: ? “EOF”没有容错率,一旦结尾的分界符存在空格或者制表符,就会导致脚本报错。 ? “-EOF”有一定的容错率,结尾的分界符可以允许存在制表符。 [[email?protected]~]#more b.sh #!/bin/bash //导入bash解释器 hostname=$1 password=$2 /usr/bin/expect<<-EOF //将EOF作为分界符,下面所有操作均停留在当前终端 spawn ssh [email?protected]${hostname} //启动进程,开始追踪ssh命令 expect { "(yes/no)" {send "yesr";exp_continue} "*password" {send"$passwordr"} } expect "*]#" send "exitr" expect eof //等待分界符结束 EOF //另一位分界符,代表操作结束 Demo实例直接执行Demo #!/usr/bin/expect #超时时间 set timeout 20 log_file test.log log_user 1 #参数传入 set hostname [lindex $argv 0] set password [lindex $argv 1] #追踪命令 spawn ssh [email?protected]$hostname #捕捉信息并且匹配,免交互执行 expect { "Connection refused" exit "service not known" exit "(yes/no)" {send "yesr";exp_continue} "*password" {send "$passwordr"} } #控制权交给控制台执行 interact exit 效果如下 嵌入执行Demo #!/bin/bash user=$1 password=$2 #非交互命令放在expect外 useradd $user #开始进行交互 expect <<-EOF spawn passwd $user expect "新的*" send "${password}r" expect "重新*" send "${password}r" expect eof; EOF #以上为脚本实际内容 效果如下: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |