我们有一个备份例程,以前在同一台服务器上从一个磁盘运行到另一个磁盘,但最近将源数据移动到远程服务器并尝试通过 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,也许还有几个管道之间的一个或两个“>>”。啊,好吧。;-)
答案1
使用 cron 在源服务器上运行与之前脚本类似的版本,它会将所有文件存档并加密到目录中。在此之后的适当时间间隔内,在目标服务器上运行 cron 通过 SSH 对该位置进行 rsync。您可以使用 scp,但 rsync 有很多优点。
否则,我会放弃您的要求并使用 SSH 管道从目标运行按需混合解决方案。
答案2
我不知道 sshfs 是否能成为您的解决方案。这样您就不必允许不受限制的 ssh,甚至不必更改您的 bash 脚本。(不过我猜性能会稍微差一些,也许您还有其他要求不允许这种方法。)
答案3
更新:经过一些实验,我研究出了如何通过 stdout 将 scp 从目标服务器传输到 gpg:
scp -r -p -B [email protected]:/mnt/disk1/bsource/filename /dev/stdout | gpg -e -r "Backup Key" --batch --no-tty -o "filename.gpg"
我认为对于另一半,我将在源服务器上运行排序作业,并将生成的目录名称输出到静态位置的文本文件,该文件将首先从目标系统进行 scp,然后进行 cat 处理到源位置的变量中。