如何解决通过不使用 SSH 的 SFTP 删除子目录中超过一周的文件
背景
目前我正在将数据推送到一个 SFTP 服务器,其他进程和系统不用于进一步的处理。所有文件共享一个根文件夹,但它们根据某些类别细分为子文件夹。此文件夹结构不得更改且无法更改。经过一段时间(目前为 7 天)后,我需要自动删除这些文件。
不幸的是,服务器有严格的访问权限,我只能通过SFTP访问特定目录; SSH 等是被禁止的。这种自动化流程的挑战在于以下限制:
- 仅SFTP-protocoll
- 不允许更改任何文件夹逻辑;新旧文件需要共享相同的目录
- SFTP 命令必须从 CRON 作业发出。因此,SFTP-commands 需要作为 one-liners 处理。
- 无法在 SFTP 服务器上安装/更改任何内容
echo "rm $_file_name" | sftp $username@$sftp_server
然而,我最纠结的问题是在一行中读取 SFTP 服务器上的文件并按日期标准过滤此输出。
问题
如果文件超过一周,我如何才能仅通过 SFTP 在目录中实现 CRON 作业删除文件?
注意:我知道诸如 here 和 here 之类的问题;无论如何,这些都没有我的局限性。
解决方法
一段时间后,我在逐步学习过程中找到了解决方案:
步骤 1:检索所有子目录
首先,我需要获取存储文件的所有目录。
假设所有相关目录都是 \IN
的子目录,我的解决方案是获取该信息的 String
-return 并迭代拆分的 `String。
# Get the string the sftp-command returns for listing all directories in /IN.
sftp_dirs=$(echo $(echo ls | sftp $username@$sftp_server:/IN))
# Then erase the log-information from that string sftp appends to it.
# This leaves a string which can be split in order to iterate over it.
process_dirs="${sftp_dirs/'Changing to: /IN sftp> ls '/}"
# Now iterate over each directory and retrieve the files.
for _dir in $(echo $process_dirs | tr " " "\n")
do
# Fill in Step2
done
第 2 步:检索所有文件及其创建日期
SFTP 服务器上的文件创建时间戳是我将文件推送到服务器的日期。因此,如果文件在服务器上存储超过 7 天,可以通过它们的创建时间来识别。
这里的挑战是从 SFTP 的回显输出中检索此信息。由于我拥有在运行 CRON 作业的服务器上安装所需的所有必要权限,因此我使用了 LFTP
的帮助,因为我无法使用纯 SFTP 进行安装。
最后,解决方案是从 LFTPs 输出中读取一个数组。
# Returns an array with all files stored in $_dir with their respective timestamps.
# $_dir is the loop-variable from Step 1
readarray -t _files <<< "$(lftp -u $username,sftp://$sftp_server:/IN/$_dir -e "cls -B --date --time-style long-iso; exit")"
请注意,我将时间戳配置为 long-iso
以进行进一步处理。
因此,现在遍历所有文件以识别超过 7 天的文件,例如:
for _file in "${_files[@]}"
do
# Fill in Step3
done
第 3 步:检索和删除旧文件
代码如下:
# Get the files date in the desired date format
# (remember that long-iso was chosen in Step 2)
# _file is the loop-variable from Step 2
_file_date=$(date -d "${_file:0:10}" +%s)
_file_name="/IN/"$_dir"/"${_file:17}
# Compare the date-difference
deletion_date=$(date -d 'now - 7 days' +%s)
_datediff=$(( (_file_date - deletion_date) / 86400 ))
最后,如果 datediffs 结果显示文件超过 7 天,则删除它
if [ $_datediff -lt 0 ]
then
# Pass the file to sftp and issue the delete command.
echo "rm $_file_name" | sftp $username@$sftp_server
fi
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。