shell里expect自动输入密码

通常在写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脚本时小时的自增会出现进制的问题,代码一用了最笨的方法解决大笑,仅供参考。

版权声明:本文为博主原创文章,未经博主允许不得转载。

猜你喜欢

转载自blog.csdn.net/iboyman/article/details/79419875