需求描述:
最近需要在两台没有打通的服务器之间进行数据传输,因为设置的任务每天自动调度,因此不能直接使用scp命令直接拿数据,不然每次都要手动输入密码。后发现可以使用spawn命令可以解决这一问题,同时将另外一个机器的数据上传到hdfs集群上。在此记录一下~
通过shell脚本实现上述需求,实现代码如下:
#!/bin/sh
data_target="/home/admin/hotel/jk_data"
set -e
WORKDIR=`dirname $0`
DIR=`cd $WORKDIR&&pwd`
cd $DIR
source ../config.sh
echo "[`date`] getting data from table sftp_device for $YESTERDAY_DATE start"
#免登陆
/usr/bin/expect <<-EOF
set timeout 30
spawn sftp data-dashuju@10.129.11.111:/data/bigdata/$YESTERDAY_DATE/tmp_move_phone_online.txt $data_target/phone_onlie/
expect "*password"
send "Jxxxx" # 机器真实密码
expect eof
EOF
#文件重命名
mv $data_target/tmp_move_phone_online.txt $data_target/tmp_move_phone_online_$YESTERDAY_DATE.txt
set +e
hdfs dfs -mkdir $hdfs_location/move_phone_online
set +e
hdfs dfs -mkdir $hdfs_location/move_phone_onlie/pt=$YESTERDAY_DATE
set -e
hdfs dfs -copyFromLocal -f $data_target/tmp_move_phone_online_$YESTERDAY_DATE.txt $hdfs_location/move_phone_onlie/pt=$YESTERDAY_DATE
# -f 的作用是:如果集群分区文件已存在,则进行覆盖
#分区修复
hive -e"msck repair table htl.move_phone_online"
echo "[`date`] getting data from table sftp_device for $YESTERDAY_DATE Finish"