题记: 最近被网络折腾的毫无脾气,不是这里安全问题就是那里权限问题,想要传输个文件真是难得要死。 历经千辛万苦,终于搭成功了定时sftp传输文件的操作,这技巧一定得记下来,以后估计会很常用:


背景: 学校超算由于安全需要不支持ftp传输文件,而合作方的服务器不支持rsync和scp等操作,于是综合考虑,选择使用sftp进行文件的传输。 sftp与ftp语法基本一致,好处是使用了sshd守护进程,坏处是传输效率比较低,还好在我的应用中只是传输小文件,所以sftp恰巧适合。 同时,由于最终的要求是每天将我们自己定时运行的空气质量预报的结果图片传递给合作方服务器,因此选择在crontab中加了个shell脚本使用lftp驱动sftp进行文件的上传。


批量文件夹上传脚本如下:

#!/bin/bash
# write by changming
# 2020-11-09

USER=username # 远程sftp服务器端用户名
PASSWORD=password # 远程sftp服务器端密码
SCRDIR=/localpath/localpath # 本地服务器拟上传路径
DESDIR=/dongguan/output # 远程sftp服务器拟存储路径
IP=XX.XX.XX.XX # 远程sftp服务器IP
PORT=XXXXX # 远程端口

cd ${SCRDIR}
FILES=`ls`

for FILE in ${FILES}
do
    echo ${FILE}
lftp -u ${USER},${PASSWORD} sftp://${IP}:${PORT} <<EOF
cd ${DESDIR}
lcd ${SCRDIR}
mirror -R ${FILE} ${FILE}
bye
EOF

echo "commit to sftp successfully"

done

exit 0

代码详解:

  1. 使用lftp驱动sftp的原因是因为sftp无法以eof的形式传递参数;
  2. sftp直接操作的格式是’sftp -P 端口 用户名@ip’,使用lftp时则是’lftp -u 用户名,密码 sftp://ip:端口’;
  3. 传递文件夹的话需要在sftp中使用mirror命令,如果只是上传文件可以使用put命令