我使用 rsync
将客户端上的数据与服务器上解密的 ecryptfs 容器同步。
我想要实现的是以下自动过程:
- 如果在服务器上,
keyctl show
已经有我想要的密钥签名,请转到 (3)。 -
ecryptfs-add-passphrase --fnek
将我的密钥添加到服务器上的密钥环 -
mount -i /mnt/path/to/decrypted
以确保解密的文件夹已装载到服务器上 - 从客户端到服务器的
rsync
- 可选:卸载文件夹并删除密钥签名(此处不重要)
目前,对于步骤 1、2、3,我使用 ssh -tq ...
来执行命令并评估结果。
我的问题如下:似乎 ecryptfs 需要在服务器上进行持久的用户会话。否则,由于用户注销,将添加并立即删除密钥(ssh -tq ...
命令完成后结束)。
我刚刚意识到ssh -tq 'ecryptfs-add-passphrase --fnek; mount -i /mnt/path/to/decrypted'
显然按预期工作。之后再次删除密钥,但装载成功。这意味着我必须在服务器上实现"动态提示"(步骤 1)。这已经是最好的解决方案,还是我也可以在客户端上实现这一点?
我今天在试图准确理解您所描述的内容时偶然发现了您的帖子几次,但没有找到任何帮助。我终于设法自己找到了解决方案。
此解决方案是利用 rsync 的--rsync-path
选项。以下是手册页的摘录:
--rsync-path=PROGRAM
Use this to specify what program is to be run on the remote
machine to start-up rsync. Often used when rsync is not in the
default remote-shell’s path (e.g. --rsync-
path=/usr/local/bin/rsync). Note that PROGRAM is run with the
help of a shell, so it can be any program, script, or command
sequence you’d care to run, so long as it does not corrupt the
standard-in & standard-out that rsync is using to communicate.
One tricky example is to set a different default directory on
the remote machine for use with the --relative option. For
instance:
rsync -avR --rsync-path="cd /a/b && rsync" hst:c/d /e/
手册最后一段中给出的示例给了我使用此参数挂载 ecryptfs 目录的想法。
这是代码:
rsync --rsync-path="(printf "%s" "$passphrase" | ecryptfs-add-passphrase --fnek && ecryptfs-mount-private) &> /dev/null && rsync" -aKLv local_to_sync remotehost.com:~/Private/