Tar 并使用 OpenSSL 加密并将结果直接转储到 ssh 服务器

Tar and encrypt with OpenSSL and dump the result directly to an ssh server

我曾 询问有关将 tar 编辑的文件夹转储到 SSH target 的问题。这在备份没有足够磁盘 space 的服务器时很有用。我得到的解决方案是这样的:

tar czv <stuff to backup> | ssh user@server.com 'cat > /home/user/backupfolder/backup.tar.gz'

但现在的问题是我通常通过管道 tar 到 openssl 以使用

加密我的包
tar zcpf / | openssl des3 -salt | dd of=backup.des3

我的问题:现在我想做同样的事情,但是将生成的存档直接转储到 SSH target 中,如 中所示但使用 OpenSSL 加密。

我尝试了以下方法:

tar zcpf / | openssl des3 -salt | ssh user@backupserver.com 'cat > /some/dir/backup.tar.gz'

这会导致 OpenSSL 要求的密码与 ssh 要求的密码之间的竞争,从而导致 OpenSSL 在重复输入密码时拒绝输入密码。

注意: 使用 public 密钥进行无密码登录对于我的情况来说不是一个有用的解决方案。 (编辑:将密码传递给 OpenSSL 也不是解决方案)。

有没有办法毫无问题地做到这一点?我看到的解决方案是让 OpenSSL 询问我密码,然后 ssh 询问我密码,两者之间没有竞争。

提前致谢。如果您需要任何其他详细信息,请询问。

您可以将带有 pass 参数的密码传递给加密。

这应该可以防止稍后寻求加密密码,然后与 SSH 的密码提示发生冲突。

tar zcpf / | openssl des3 -salt -pass pass:1234 | ssh user@backupserver.com 'cat > /some/dir/backup.tar.gz'

编辑:

这个答案不符合OP的要求。稍后所做的编辑提到将密码作为参数传递是不可接受的。

所以我终于设法创建了自己的 bash 脚本来完成工作并解决问题。请记住,如果要备份根文件夹,脚本必须是 运行 作为根目录。您可以通过在脚本开头添加根检查器来使其更漂亮。

#!/bin/bash

dirToBackup=/
targetDir=/path/to/encrypted/backup/file.des3
sshuser=user
sshserver=myserver.com

read -s -p "Enter Encryption Password: " mypassword1
printf "\n"
read -s -p "Repeat Encryption Password: " mypassword2
printf "\n"

#make sure the passwords match
if [ "$mypassword1" != "$mypassword2" ]
then
        echo "Passwords don't match! Exiting."
        exit
else
#if they match, make sure they're not empty
        if [ -z "$mypassword1" ]
        then
                echo "Password cannot be empty... Exiting."
        else
                tar zcp $dirToBackup | openssl des3 -salt -pass pass:$mypassword1 | ssh ${sshuser}@${sshserver} "dd of=${targetDir}"
        fi
fi