从访问受限的源中检索经过验证的数据

从访问受限的源中检索经过验证的数据

简要地:我需要从基于 Linux 的设备下载数据,验证数据完整性,并删除源文件(不能使用 rsync)。

细节: 我有一个水听器,它被部署在海底,作为海洋观测站的一部分。水听器出厂时运行的是 [非常] 轻量级的类似 RHEL 的 Linux 发行版。水听器每 5 分钟生成一个新的 .wav 文件,并将其存储在 SD 卡上。内部存储空间很小,因此我们希望使用在岸上的“检索机”上运行的 cronjob/脚本来检索数据,验证文件是否已完全传输,然后从水听器中删除源文件。我的第一个想法是使用 rsync,但源不允许 rsync 连接(请参阅下面的复杂情况)。

并发症:

  1. 我们的确是不是在水听器上拥有 root 或 sudo 权限。
  2. 水听器仅支持以下协议:scp、wget、FTP、ssh
  3. 不支持 rsync :(
  4. 不允许匿名 FTP。
  5. 在每个 5 分钟间隔的开始(例如 11:00、11:05 等)都会创建一个文件,在 5 分钟间隔的结束(例如 11:04:59.999、11:09:59.999 等)时,会写入文件的剩余部分。这使得无法只下载所有文件然后删除所有源文件,因为当前录制的 5 分钟文件的文件“存根”也会被删除(“存根”包含重要的元数据)。另请注意,当文件最初写入时,它以 28MB 的完整(最终)文件大小写入,因此我无法仅根据文件大小过滤文件。6) 有时,5 分钟间隔会分成两个文件(文件大小总计为 28 MB)。7) 远程主机(水听器)无法运行 cronjobs,因此大多数命令必须通过 ssh 传递。

文件名格式为:SBW_yyyymmdd_HHMMSS.wav

提前感谢您的帮助和回答,如果我可以提高问题的清晰度/细节,请随时告诉我。

更新: 参考了下面评论中的一些提示,并粗略地尝试了一下,这就是我想到的(我对结果进行了一些概括)。该脚本每 5 分钟作为我们的检索服务器上的 cron 作业运行一次。它非常慢且效率低下。任何输入都会有所帮助!

#!/bin/bash
## Define Variables
remUser="<user>"           # Hydrophone SSH Username
remHost="<remote-host>"    # Hydrophone hostname   
sshCon="$remUser@$remHost"

## Remove previous md5 and get current MD5 Sums from remote-host
echo "Getting remoteWAV.md5 info"
rm -f remoteWAV.md5
ssh $sshCon 'cd ~/Data; md5sum *.wav' > remoteWAV.md5

## Check exit status and exit if bad connection
if [ $? -gt 0 ]; then echo "Connection failed, aborting"; exit 1; fi

## Wait One minute for any changes to remote files
### This is to allow any in-progress files the chance
### to change their md5sum from the ones gathered earlier
echo "pausing 60 sec..."
sleep 60
echo "resuming..."

## Download the files
echo "Getting files from remote host"
scp $sshCon:~/Data/*.wav /path/to/local-data-files/
if [ $? -gt 0 ]; then echo "Connection failed, aborting"; exit 1; fi

## Check the md5 sums
##    - First delete the old localWAV.md5 file
##    - Then we need to add the local directory to the filenames
##    - Now we can finally check the remote vs local checksums
echo "Checking local files against remoteWAV.md5 sums"
rm -f localWAV.md5
sed -i 's|SBW|/path/to/local-data-files/SBW|g' remoteWAV.md5
md5sum -c < remoteWAV.md5 > localWAV.md5

## Display checksum results
echo "Local MD5 results:"
echo "=================="
cat localWAV.md5

## Remove files that failed md5sum check from local storage
##    (This is so users don't download bad data)
cat localWAV.md5 | grep -v "OK" | cut -d ":" -f 1 | xargs -I {} rm -fv {}

## Find list of files that were downloaded successfully
##     - First remove the old goodfiles.tmp list
##     - Create a new listing of files that passed the md5sum check
##       but remove the last (most recent) file from the list in case
##       it is still being written on the remote host (second safety check)
##     - Remove the local directory from the filenames
##     - Copy the list of good files to the remote host
##     - Issue the delete command on the remote host
rm -f goodfilesWAV.tmp
head -n -1 localWAV.md5 | grep "OK" | cut -d ":" -f 1 > goodfilesWAV.tmp
sed -i 's|/path/to/local-data-files/||g' goodfilesWAV.tmp
echo "Sending deletion list to remote host"
scp ./goodfilesWAV.tmp $sshCon:~/Data/
echo "Removing files from remote host"
ssh $sshCon 'cd ~/Data; xargs rm -fv < goodfilesWAV.tmp; rm goodfilesWAV.tmp'
echo "Complete."

相关内容