纯手打,转载务请附上本文网址!!!
关于用正则表达式解析文件提取想要的内容请查看此篇文章:实习,有一个功能是遍历集群中服务器的log文件(大文件)提取想要的数据;但是文件都在别的服务器上,和程序运行的服务器不是同一个服务器,所以需要将别的服务器上的log大文件scp到本地然后再进行解析;
关于用正则表达式解析文件提取想要的内容请查看此篇文章:
首先,你需要安装expect,题主用的是CentOS安装命令如下:
输入yum -help,会出现帮助,其中有一行 -y, --assumeyes 回答全部问题为是,知道-y的意思了吧?
对于yum命令不知道怎么使用的,yum -help里面会有用法
sudo yum -y install expect
然而用过scp命令的小伙伴都知道scp命令是需要手动输入密码的,如果想不输入密码的话就要使用到shell脚本,进入正题先上shell脚本内容干货
#!/usr/bin/expect
set ip [lindex $argv 0]
set password [lindex $argv 1]
set timeout -1
spawn scp -o StrictHostKeyChecking=no -P 22 -r root@$ip:/data/log/access.log /data/test
expect {
"(yes/no)?" {
send "yes\n"
expect "*assword:" { send "$password\n"}
}
"*assword:" {
send "$password\n"
}
}
expect eof
下面来解释一下shell脚本中的意思
第一行开头:#!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面跟的是此解释此脚本的shell的路径;至于,#!/usr/bin/expect类推即可
#!/usr/bin/expect
第二行第三行中的参数设置:expect接收参数的方式和bash脚本的方式不太一样,bash是通过$0 ... $n 这种方式,而expect是通过set <变量名称> [lindex $argv <param index>]。例如set ip [lindex $argv 0]表示把ip作为第一个参数,使用ip的值时用 $ip即可
set ip [lindex $argv 0]
set password [lindex $argv 1]
第四行:expect命令中的timeout,spawn我们要执行的命令,然后就给出一堆expect的屏幕输出,如果输出match了我们的expect的东西,我们就会send一个命令上去,模拟用户输入。但是expect中等待命令的输出信息是有一个timeout的设定的,默认是10秒。这个特性是防止那些执行死机的命令的。一旦到了这个timeout,还是没有屏幕输出的话,expect脚本中下面的代码就会执行。或者我们在expect脚本中如果定义了timeout的响应代码的话,这些代码就会被执行。 解决这样的问题非常简单,最简单的办法就是在expect脚本的开头定义: set timeout -1 -- 没有timeoutset timeout XX -- 设定具体的timeout时间(秒)
set timeout -1