我们有一个备份例程,之前在同一服务器上从一个磁盘运行到另一个磁盘,但最近将源数据移动到远程服务器并尝试通过 scp 复制作业。
我们需要在目标服务器上运行脚本,并且我们已经在两台服务器之间设置了基于密钥的 scp(不需要用户名/密码)。使用 scp 复制特定文件和目录效果很好:
scp -r -p -B [email protected]:/mnt/disk1/bsource/filename.txt /mnt/disk2/btarget/
但是,我们之前的例程会遍历源磁盘上的目录以确定要复制哪些文件,然后通过 gpg 加密单独运行它们。有没有办法只通过使用 scp 来做到这一点?
同样,此脚本需要从目标服务器运行,并且运行作业的用户对目标系统只有 scp(无 ssh)访问权限。
旧工作看起来像这样:
#Change to source dir
cd /mnt/disk1
#Create variable to store
# directories named by date YYYYMMDD
j="20000101/"
#Iterate though directories in the current dir
# to get the most recent folder name
for i in $(ls -d */);
do
if [ "$j" \< "$i" ]; then
j=${i%/*}
fi
done
#Encrypt individual files from $j to target directory
cd ./${j%%}/bsource/
for k in $(ls -p | grep -v /$);
do
sudo /usr/bin/gpg -e -r "Backup Key" --batch --no-tty -o "/mnt/disk2/btarget/$k.gpg" "$/mnt/disk1/$j/bsource/$k"
done
谁能建议如何通过目标系统中的 scp 执行此操作?提前致谢。
编辑:我看到的所有 bash 单行线在这里飞来飞去,我有一半期待在几秒钟内看到一些史诗般的东西弹出 cat、grep,也许还有几个管道之间的“>>”或两个。呃,好吧。;-)
使用 cron 在源服务器上运行类似版本的早期脚本,它将所有文件存档并加密到一个目录中。在此之后的适当时间间隔内,在目标服务器上通过 SSH 在该位置设置 rsync。你可以 scp 但 rsync 有很多优点。
否则,我会放弃您的要求并使用 SSH 管道从目标运行按需混合解决方案。
我不知道 sshfs 是否可以成为您的解决方案。这样您就不必允许不受限制的 ssh,甚至不必更改 bash 脚本。(我想性能会更差一些,也许你有额外的要求不允许这种方法。)
更新:经过一些实验,我已经研究出如何通过标准输出从目标服务器将 scp 传输到 gpg:
我认为另一半我将在源服务器上运行排序作业并将生成的目录名称输出到静态位置的文本文件中,该文件将首先从目标系统进行 scp'd,然后是 cat'd到源位置的变量中。