通常在写shell时,使用scp、ssh时总要手动输入密码,是一件很烦人的事情,使用expect可以免手动数据的麻烦。
有如下脚本里需要使用expect调到另一台服务器里做其他操作,代码如图:
主要代码在下图73行
#bin/bash
#########
## GP项目需求的启动脚本
## 编写者:zqm
## 日期:2018-02-09
## 调用方式:nohup sh gp_start.sh begin_day end_day name > ./gp_start.log 2>&1 &
## 备注:name的数据有两种:distinct 和 distinctbmd
## 如果口径有变动,请酌情修改。
########
#数据开始日期,结束日期
begin_day=$1
end_day=$2
#加不加白
name=$3
#数据开始小时,结束小时
begin_hour=0
end_hour=23
##newclick的数据目录
data_newclick='/source/click'
#MR结果数据目录
data_hdfs='/Gp/hour_test'
#爬虫需要的url结果目录
data_txt='/Gp/hour_test/url_result'
##jar包的目录
data_jar='/Gp/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 u_lx_data@10.5.25.23:/gp/url_result/
expect "*password*" ## 窗口包含此字符串 就发送下行的密码
send "XXXXXXX\r" ## 密码 \r代表回车
spawn ssh u_lx_data@10.5.25.23
expect "*password*"
send "#XXXXXXX\r"
expect "*DDP-DN-019*"
send "cd /gp/\r"
expect "*/gp/*"
send "./mv_data_to_pachong.exp $day $hour $type \r"
expect eof # 结束后退出,不停留在ssh后的服务器上
另外:写shell脚本时小时的自增会出现进制的问题,代码一用了最笨的方法解决,仅供参考。
版权声明:本文为博主原创文章,未经博主允许不得转载。