linux 之 shell脚本实现SFTP下载、上传文件、执行sftp命令

这篇具有很好参考价值的文章主要介绍了linux 之 shell脚本实现SFTP下载、上传文件、执行sftp命令。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求

需求方通过sftp不定时的上传一批用户(SBXDS_ACC_M_任务ID_yyyymmddHHMMSS.csv),需要我们从这些用户中找出满足条件的用户。然后把这些结果用户通过文件的形式上传到ftp。

环境说明

ip1能连接hive库环境,不能连接sftp。
ip2不能连接hive库环境,能连接sftp。
ip1和ip2是共享盘,能同时访问公共目录。

目录规划

源文件名: SBXDS_ACC_M_任务ID_yyyymmddHHMMSS.csv (例:SBXDS_ACC_M_test001_20240201103828.csv)
结果文件名: WTF_YBZ_DSGS_任务id.csv (例:WTF_YBZ_DSGS_test001.csv)
本地路径: /date/localPath/SBXDS_ACC_M
sftp下载路径(源文件):/ftpdata/preciseUpload
sftp上传路径(结果文件):/ftpdata/orderringlist

处理逻辑

1.通过sftp获取preciseUpload目录下,当天的 SBXDS_ACC_M_*_YYYYMMDD*.csv 文件名,并写入本地文件SBXDS_ACC_M.txt
2.比对SBXDS_ACC_M.txt里面的文件是否在SBXDS_ACC_M目录下存在,不存在则将文件名写入SBXDS_ACC_M_NEWFILES.txt。
3.获取SBXDS_ACC_M_NEWFILE.txt里面的文件,并写入hive表 dods_ftp_target_users partition(task_id)。
4.目标用户与通信圈用户匹配,跑出结果数据dapp_ftp_calling_txq_users partition(task_id)。
5.结果数据写入文件WTF_YBZ_DSGS_task_id.csv,并上传sftp
6.为了防止文件正在传输,内容未传输完,需求方就把文件取走了,导致漏数据的情况。在文件上传之后,对文件进行重命名处理。

hive表

-- 目标用户hive表
create table ods_target_users(
phone_no string
)

-- 结果数据hive表
create table dapp_target_result_users(
phone_no string,
msg_info string
)

脚本执行顺序

sh ftp_getTodayFiles.sh 20240201 # ip1执行,文件处理
sh ftp_getTxq_users.sh # ip2 执行,跑SQL
sh ftp_sftpPutFiles.sh # ip1 执行,文件处理

脚本

linux 之 shell脚本实现SFTP下载、上传文件、执行sftp命令linux 之 shell脚本实现SFTP下载、上传文件、执行sftp命令
#!/bin/bash
# ftp_getTodayFiles.sh
# ip2 执行
# 调用方式 sh ftp_getTodayFiles.sh 20240201

# 定义函数,获取文件名称
function funcGetTodayFilesName(){
dateNo=$1
PORT=22
HOST="ip1"  
USERNAME="uname1"
PASSWORD="123456"  
LOCALDIR="/date/localPath/SBXDS_ACC_M"
SFTPDIR="/ftpdata/preciseUpload"
FILENAME="SBXDS_ACC_M_*_$dateNo*"
cd $LOCALDIR
/usr/bin/expect << EOF
spawn sftp -P $PORT $USERNAME@$HOST
expect "*Password*"
send "$PASSWORD\r"
expect "*#"
send "cd $SFTPDIR\r"
expect "*#"
send "ls -1 $FILENAME\r"
expect eof
EOF
}

# 定义函数,sftp获取文件
function funcSftpGetFile(){
FILENAME=$1
PORT=22
HOST="ip1"  
USERNAME="uname1"
PASSWORD="123456"  
LOCALDIR="/date/localPath/SBXDS_ACC_M"
SFTPDIR="/ftpdata/preciseUpload"
cd $LOCALDIR
/usr/bin/expect << EOF
spawn sftp -P $PORT $USERNAME@$HOST
expect "*Password*"
send "$PASSWORD\r"
expect "*#"
send "cd $SFTPDIR\r"
expect "*#"
send "get $FILENAME \r"
expect eof
EOF
}

# 调用函数,获取文件名称

dateNo=$1
LOCALDIR="/date/localPath/SBXDS_ACC_M"
cd $LOCALDIR
echo "开始获取sftp目录下当天文件名称SBXDS_ACC_M_*_$dateNo*......"
funcGetTodayFilesName $dateNo|grep ".csv" > SBXDS_ACC_M_FILES.txt
echo "获取sftp目录下当天文件名称结束"

dayfiles=$(cat SBXDS_ACC_M_FILES.txt|wc -l)
if [ $dayfiles -eq 0 ]; then
  echo "sftp今日无文件。"
  exit
else
  echo "当日所有文件:"
  cat SBXDS_ACC_M_FILES.txt
fi


echo "清空文件 SBXDS_ACC_M_NEWFILES.txt"
echo "判断本地是否存在文件,不存在则将文件名写入文件SBXDS_ACC_M_NEWFILES.txt"
> SBXDS_ACC_M_NEWFILES.txt
for filename in $(cat SBXDS_ACC_M_FILES.txt|sed 's/\r$//')
do
    if [ -e $filename ];    then
      echo "$filename 已存在"
  else
      echo "$filename 新文件"
      echo $filename >> SBXDS_ACC_M_NEWFILES.txt
  fi
done

newfiles=$(cat SBXDS_ACC_M_NEWFILES.txt|wc -l)
if [ $newfiles -eq 0 ]; then
  echo "无新增文件。"
  exit
else
  echo "文件名写入SBXDS_ACC_M_NEWFILES.txt结束"
  echo "当日新增文件$newfiles个:"
  cat SBXDS_ACC_M_NEWFILES.txt
fi

# 调用函数,sftp获取文件
echo "开始下载文件...."
LOCALDIR="/date/localPath/SBXDS_ACC_M"
cd $LOCALDIR
for filename in $(cat SBXDS_ACC_M_NEWFILES.txt|sed 's/\r$//')
do 
    echo "下载$filename..."
    funcSftpGetFile $filename
done

echo "下载文件结束,文件名如下:"
cat SBXDS_ACC_M_NEWFILES.txt

# 验证 SBXDS_ACC_M_NEWFILES.txt
newfiles2=$(cat SBXDS_ACC_M_NEWFILES.txt|wc -l)
if [ $newfiles2 -eq 0 ]; then
  echo "文件异常!!!"
  exit 1
fi
ftp_getTodayFiles.sh
linux 之 shell脚本实现SFTP下载、上传文件、执行sftp命令linux 之 shell脚本实现SFTP下载、上传文件、执行sftp命令
#!/bin/bash
# ftp_getTxq_users.sh
# ip1 执行
# 把SBXDS_ACC_M_NEWFILE.txt里面的文件写入hive表 dods_ftp_target_users partition(task_id)。
# 匹配通信圈用户 dapp_ftp_txq_users
# 结果数据导入文件WTF_YBZ_DSGS_task_id
# 调用格式: sh ftp_getTxq_users.sh 20240114

dateNo=$1
LOCALDIR="/date/localPath/SBXDS_ACC_M"
cd $LOCALDIR

newfiles=$(cat SBXDS_ACC_M_NEWFILES.txt|wc -l)
if [ $newfiles -eq 0 ]; then
  echo "无新增文件。"
  exit
fi


fileList=()
for filename in $(cat SBXDS_ACC_M_NEWFILES.txt|sed 's/\r$//')
    do
    task_id=$(echo $filename|cut -d'_' -f4)
    echo "文件名: $filename,任务ID: $task_id"
    echo "执行命令:hadoop fs -mkdir hdfs://ns2/data//dods/dods_ftp_target_users/task_id=$task_id"
    hadoop fs -mkdir hdfs://ns2/data//dods/dods_ftp_target_users/task_id=$task_id
    if [ $? -eq 0 ]; then
      echo "执行命令:hadoop fs -put -f $filename hdfs://ns2/data//dods/dods_ftp_target_users/task_id=$task_id"
        hadoop fs -put -f $filename hdfs://ns2/data//dods/dods_ftp_target_users/task_id=$task_id
  else
      echo "分区 $task_id 已存在。"
      echo "执行命令:hadoop fs -put -f $filename hdfs://ns2/data//dods/dods_ftp_target_users/task_id=$task_id"
        hadoop fs -put -f $filename hdfs://ns2/data//dods/dods_ftp_target_users/task_id=$task_id
  fi
    
  # 匹配通信圈用户
  hive -e"
  MSCK REPAIR TABLE dods_ftp_target_users;
  insert overwrite table dapp_ftp_txq_users partition(task_id='${task_id}')
  select a.phone_no,
         b.msg_info
  from   dods_ftp_target_users a,
         dods_msg_info b
  where  a.phone_no=b.phone_no
  and    a.task_id='${task_id}'
  and    b.deal_day='${dateNo}'
  group  by a.phone_no,
         b.msg_info
  "
  # 结果数据导入文件
  hive -e"
    select concat_ws(',',phone_no,msg_info) 
    from dapp_ftp_txq_users 
    where task_id = '${task_id}' 
  " > WTF_YBZ_DSGS_${task_id}
  
  # 文件记录数
  file_rows=$(cat WTF_YBZ_DSGS_${task_id}|wc -l)
  msgs="源文件$filename的结果文件WTF_YBZ_DSGS_${task_id},记录数$file_rows。"
  fileList+=$msgs
  done

echo "************************* 执行成功 *************************"
for msg in ${fileList[*]}
do
    echo $msg
done
ftp_getTxq_users.sh
linux 之 shell脚本实现SFTP下载、上传文件、执行sftp命令linux 之 shell脚本实现SFTP下载、上传文件、执行sftp命令
#!/bin/bash
# ftp_sftpPutFiles.sh
# ip2 执行
# 调用格式 sh ftp_sftpPutFiles.sh


# 定义函数,sftp上传文件
function sftpPutFiles(){
FILENAME=$1
PORT=22
HOST="ip1"  
USERNAME="uname1"
PASSWORD="123456"  
LOCALDIR="/date/localPath/SBXDS_ACC_M"
SFTPDIR="/ftpdata/orderringlist"
cd $LOCALDIR
/usr/bin/expect << EOF
spawn sftp -P $PORT $USERNAME@$HOST
expect "*Password*"
send "$PASSWORD\r"
expect "*#"
send "cd $SFTPDIR\r"
expect "*#"
send "put $FILENAME \r"
expect "*#"
send "rename $FILENAME ${FILENAME}.csv \r"
expect eof
EOF
}

# 调用函数,sftp上传文件
LOCALDIR="/date/localPath/SBXDS_ACC_M"
cd $LOCALDIR
newfiles=$(cat SBXDS_ACC_M_NEWFILES.txt|wc -l)
if [ $newfiles -eq 0 ]; then
  echo "无新增文件。"
  exit
fi

echo "开始sftp上传文件...."
for filename in $(cat SBXDS_ACC_M_NEWFILES.txt|sed 's/\r$//')
    do
    task_id=$(echo $filename|cut -d'_' -f4)
    echo "上传WTF_YBZ_DSGS_${task_id}..."
    sftpPutFiles WTF_YBZ_DSGS_${task_id}
    done
echo "*************** sftp上传文件结束 ***************"
ftp_sftpPutFiles.sh

 文章来源地址https://www.toymoban.com/news/detail-825215.html

到了这里,关于linux 之 shell脚本实现SFTP下载、上传文件、执行sftp命令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Windows11 - 使用 sftp连接 CentOS 7,实现文件上传与下载

    Windows系统的cmd命令实现远程连接服务器,并且使用 sftp连接 CentOS 7,实现文件上传与下载 注意:下方所有服务器ip,均为示例ip 这样就成功连接上服务器,不过命令和Linux上命令有所区别 如下(示例): 注意:sftp 表示已经进入 sftp 的交互模式。 连接成功之后,使用 pwd 命令查

    2024年02月03日
    浏览(35)
  • shell脚本之003获取固定时间段(分钟)内的日志,并将其定时通过sftp上传至服务器中

    #!/bin/bash export PATH=/home/ccbt/software/lftp-4.9.2/usr/local/bin/:$PATH # 获取当前系统时间 now=$(date +\\\"%Y/%m/%d %H:%M:%S\\\") echo \\\"当前日期时间:$now\\\" # 当前时间戳 now_time=$(date +%s) echo \\\"当前时间戳:$now_time\\\" #获取指定开始时间的时间戳 10分钟 time_befo=$(($now_time-600)) echo \\\"指定开始时间戳: $time_befo\\\"

    2024年02月01日
    浏览(47)
  • java- SFTP文件上传下载

    ​ JSch是Java Secure Channel的缩写,是一个java实现的可以完成sftp上传下载的工具,我们可以集成它的功能到自己的应用程序,本文介绍使用JSch实现的SFTP上传下载的功能。 ChannelSftp类是JSch实现SFTP核心类,它包含了所有SFTP的方法,如 方法名 功能描述 put() 文件上传 get() 文件下载

    2024年01月19日
    浏览(45)
  • Java从sftp服务器上传与下载文件

    业务需要从sftp服务器上上传、下载、删除文件等功能,通过查阅资料及手动敲打代码,实现了操作sftp的基本功能,有需求的小伙伴可以看看具体的实现过程。 摘自百度百科:SSH文件传输协议,是一种数据流链接,提供文件访问、传输和管理功能的网络传输协议。 SFTP允许用

    2024年02月11日
    浏览(50)
  • java连接sftp服务器实现上传下载

    我最初的需求是java读取远程windows服务器的文件。查了一圈,发现将远程服务器作为ftp服务器是最方便快捷的。着手准备,首先要让远程服务器提供ftp服务,再做相关配置,然后通过代码配置远程地址,用户名密码(ftp服务设置)读取文件。 我目前使用的是 freeSSHd.exe,下载后

    2024年02月07日
    浏览(42)
  • Linux下定时执行shell脚本

    vi test.sh 录入要执行的命令  保存退出,并且对脚本进行授权  :wq chmod 777 test.sh  生产文件data.txt touch /opt/data.txt  vi /etc/crontab  录入: 一分钟执行一次  保存退出即可每个一分钟执行一次 配置说明:

    2024年02月17日
    浏览(43)
  • 【Linux】编写一个 shell 脚本&执行

    在Linux中编写和执行脚本相对简单。下面是一个基本的步骤指南,帮助你创建一个简单的bash脚本并运行它: 1. 创建脚本文件 首先,你需要使用文本编辑器创建一个新的文件。这个文件通常会有 .sh 的扩展名,以表明它是一个shell脚本。例如,你可以创建一个名为 myscript.sh 的文

    2024年04月26日
    浏览(28)
  • shell批量执行命令与文件传输脚本

    对未进行主机信任操作的服务器进行批量操作 由于ssh只能在交互模式中输入服务器密码进行登录登操作,不便于进行大批量服务器进行巡检或日志采集。sshpass恰好又解决了这个问题,使用 ssh -p passwd 可以实现命令行输入密码操作,便于进行规模巡检 首先需要在脚本执行机器

    2024年02月08日
    浏览(35)
  • 【Linux命令-shell】虚拟机中创建shell脚本、查看当前路径、执行脚本

    目录 一、创建shell脚本 二、查看当前的路径 三、执行脚本 一、创建shell脚本 shell脚本的特点 提前将可执行的命令语句写入一个文件中 顺序执行 解释器逐行解释代码 常见的脚本有:shell、python、PHP...... 注:用什么解释器就是什么脚本 编写shell脚本: 步骤: 1、新建文件 2、

    2024年02月05日
    浏览(46)
  • Linux shell编程学习笔记44:编写一个脚本,将md5sum命令执行结果保存到变量中,进而比较两个文件内容是否相同

    在  Linux shell编程学习笔记42:md5sum https://blog.csdn.net/Purpleendurer/article/details/137125672?spm=1001.2014.3001.5501 中,我们提到编写一个在Linux系统下比较两个文件内容是否相同的脚本。 基本思路是: 其中有两个难点: 1.文件的md5值的获取 2.md5值的比较 对于第1个难点,我们的解决办法是

    2024年04月10日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包