shell里expect自动输入密码

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
昨天一个网友问如何能够将输入密码的工作在shell自动完成,研究了一下,发现这种交互式的工作,普通的shell实现不了,据说可以借助expect来搞定,所以初步学习了一下expect,成果和大家分享一下: 应用一: 实现从普通用户“test”切换到root用户,自动输入root的密码,不用在终端提示符下执行密码输入操作。 步骤: (1)vi autosu.sh (2)#! /usr/bin/expect -f //指定expect工具的路径,如果不清楚具体路径,可以用"which expect"命令来查看。 spawn su - // 在expect 中用"spawn"关键字来调用命令“su - ” expect ":" //在执行了su - 命令之后,提示输入密码的提示符。例如你在执行了su - 命令之后,终端面会出现提示“口令:”,那么你就可以在这expect ":",或者expect -exact "口令:" send "rootpasswd\r" //这expect用send将你的root密码自动输入到上面的提示符之后。 interact //操作完成。 注意:这强调一下执行脚本时要注意的地方,不能按照习惯来用sh ***.sh来这行expect的程序,会提示找不到命令,因为expect用的不是bash所以会报错。执行的时候直接./***.sh就可以了。~切记! 应用二: 从普通用户切换到root之后,执行“ls”操作,调用执行aaa.sh,返回执行结果,间隔10S。 #/usr/bin/expect -f spawn su - // 在expect 中用"spawn"关键字来调用命令“su - ” expect ":" //在执行了su - 命令之后,提示输入密码的提示符。例如你在执行了su - 命令之后,终端面会出现提示“口令:”,那么你就可以在这expect ":",或者expect -exact "口令:" send "rootpasswd\r" //这expect用send将你的root密码自动输入到上面的提示符之后。 expect "#" //当遇到提示符以#结尾时,即为root权限时; send "ls\r" //expect 用spend方法调用ls 命令,并且回车(“\r”) expect "#" send "sh aaa.sh\r" //调用sh aaa.sh,即执行一个脚本文件aaa.sh。 expect "#" send "echo $?\r" sleep 10 interact

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值