那么问题来了,在脚本自动化执行的时候需要输入密码怎么办?比如你的脚本里有一条scp语句,总不能在脚本执行到这一句时手动输入密码吧 CentOS下安装命令很简单,如下
我们写一个简单的脚本实现scp拷贝文件,在脚本里配置密码,保存为scp.exp如下 - #!/usr/bin/expect
- set timeout 20
- if { [llength $argv] < 2} {
- puts "Usage:"
- puts "$argv0 local_file remote_path"
- exit 1
- }
- set local_file [lindex $argv 0]
- set remote_path [lindex $argv 1]
- set passwd your_passwd
- set passwderror 0
- spawn scp $local_file $remote_path
- expect {
- "*assword:*" {
- if { $passwderror == 1 } {
- puts "passwd is error"
- exit 2
- }
- set timeout 1000
- set passwderror 1
- send "$passwd\r"
- exp_continue
- }
- "*es/no)?*" {
- send "yes\r"
- exp_continue
- }
- timeout {
- puts "connect is timeout"
- exit 3
- }
- }
执行前确保scp.exp有执行权限,第一个参数为你本地文件,第二个为远程主机的目录,运行脚本如果报错“connect is timeout”,可以把超时设长一点,第二行set timeout 20可以设置超时时间,单位是秒。脚本执行效果如下 细心的同学一定发现了,其实expect提供的是和终端的一种交互机制,输入密码只是其中一种应用形式,只要是在终端阻塞需要输入时,都可以通过expect脚本完成自动输入,比如前面脚本里配置了两种交互场景,一种是终端提示"password:"时输入密码,还有一种是提示"yes/no)?"时输入“yes”,如果和远程主机是第一次建立连接,执行scp.exp脚本效果是这样的 所以我们可以根据终端的提示来配置输入命令,这样就能达到了自动化的效果。至于处理其它交互场景,只需要照着上面的脚本依葫芦画瓢就行了
|