通常在写shell时,使用scp、ssh时总要手动输入密码,是一件很烦人的事情,使用expect可以免手动数据的麻烦。
有如下脚本里需要使用expect调到另一台服务器里做其他操作,代码如图:
主要代码在下图73行
#bin/bash ######### ## Gocapture项目需求的启动脚本 ## 编写者:zhangqm ## 日期:2018-02-09 ## 调用方式:nohup sh gocapture_start.sh begin_day end_day name > ./gocapture_start.log 2>&1 & ## 备注:name的数据有两种:distinct 和 distinctbmd ## 如果口径有变动,请酌情修改。 ######## #数据开始日期,结束日期 begin_day=$1 end_day=$2 #加不加白 name=$3 #数据开始小时,结束小时 begin_hour=0 end_hour=23 ##newclick的数据目录 data_newclick='/user/gdpi/public/sada_new_click' #MR结果数据目录 data_hdfs='/user/u_lx_data/private/zhangqm/Gocapture/hour_test' #爬虫需要的url结果目录 data_txt='/data/u_lx_data/zhangqm/Gocapture/hour_test/url_result' ##jar包的目录 data_jar='/data/u_lx_data/zhangqm/Gocapture/hour_test' ##稽核语句 ##Check_num $data_hdfs 'groupbmd' $begin_day $begin_hour function Check_num() { num=$(hadoop fs -du -h $1/$2/$3/$4/part*|awk -F" " '{print $1}'|sed 's/ //g') echo $num } ##数据文件主函数 function Copy_data() { while [[ $begin_day -le $end_day ]]; do while [[ $begin_hour -le $end_hour ]]; do if [ $begin_hour -le 9 ];then #产生数据文件 if [ $name == 'distinctbmd' ];then hadoop jar $data_jar/$name.jar $data_hdfs/baimd.csv $data_newclick/$begin_day/0$begin_hour/ $data_hdfs/$name/$begin_day/0$begin_hour/ num=$(Check_num $data_hdfs $name $begin_day 0$begin_hour) else hadoop jar $data_jar/$name.jar $data_newclick/$begin_day/0$begin_hour/ $data_hdfs/$name/$begin_day/0$begin_hour/ num=$(Check_num $data_hdfs $name $begin_day 0$begin_hour) fi else #产生数据文件 if [ $name == 'distinctbmd' ];then hadoop jar $data_jar/$name.jar $data_hdfs/baimd.csv $data_newclick/$begin_day/$begin_hour/ $data_hdfs/$name/$begin_day/$begin_hour/ num=$(Check_num $data_hdfs $name $begin_day $begin_hour) else hadoop jar $data_jar/$name.jar $data_newclick/$begin_day/$begin_hour/ $data_hdfs/$name/$begin_day/0$begin_hour/ num=$(Check_num $data_hdfs $name $begin_day $begin_hour) fi fi if [ $num > 0 ]; then if [ $begin_hour -le 9 ];then hadoop fs -cat $data_hdfs/$name/$begin_day/0$begin_hour/*|cut -f2 > $data_txt/$name-$begin_day-0$begin_hour.txt #把产生的数据文件放到爬虫服务器 ./mv_data_to_23.exp $data_txt $begin_day 0$begin_hour $name else hadoop fs -cat $data_hdfs/$name/$begin_day/$begin_hour/*|cut -f2 > $data_txt/$name-$begin_day-$begin_hour.txt #把产生的数据文件放到爬虫服务器 ./mv_data_to_23.exp $data_txt $begin_day $begin_hour $name fi else echo 'MR小时结果数据文件'$name-$begin_day-$begin_hour'.txt没有产生,请核查原因!!' fi let begin_hour=begin_hour+1 done begin_day=$(date -d "+1 day $begin_day" +%Y%m%d) done } Copy_data
其中免密码手动输入mv_data_to_23.exp的代码如下:
#!/usr/bin/expect set timeout 3 ##设置时间 set dir [lindex $argv 0] ##参数接受 set day [lindex $argv 1] set hour [lindex $argv 2] set type [lindex $argv 3] spawn scp $dir/$type-$day-$hour.txt [email protected]:/data2/u_lx_data/zhangqm/gocapture/url_result/ expect "*password*" ## 窗口包含此字符串 就发送下行的密码 send "XXXXXXX\r" ## 密码 \r代表回车 spawn ssh [email protected] expect "*password*" send "#XXXXXXX\r" expect "*DDP-DN-019*" send "cd /data2/u_lx_data/zhangqm/gocapture/\r" expect "*/data2/u_lx_data/zhangqm/*" send "./mv_data_to_pachong.exp $day $hour $type \r" expect eof # 结束后退出,不停留在ssh后的服务器上
另外:写shell脚本时小时的自增会出现进制的问题,代码一用了最笨的方法解决,仅供参考。
版权声明:本文为博主原创文章,未经博主允许不得转载。