我使用rsync将客户端上的数据与服务器上已解密的ecryptfs容器同步。

我要实现的是以下自动过程:

  • 如果在服务器上keyctl show已经具有我想要的密钥签名,请转到(3.)
  • ecryptfs-add-passphrase --fnek将我的密钥添加到服务器上的密钥环
  • mount -i /mnt/path/to/decrypted确保已解密的文件夹已安装在服务器上
  • 从客户端到服务器的
  • rsync
  • 可选:卸载文件夹并删除密钥签名(此处不重要)

  • 当前,对于步骤1,2,3,我使用ssh -tq ...执行命令并评估结果。

    我的问题如下:看来ecryptfs需要服务器上的持久用户 session 。否则,由于用户注销,将添加密钥并立即将其删除(ssh -tq ...在命令完成后结束)。

    我刚刚意识到ssh -tq 'ecryptfs-add-passphrase --fnek; mount -i /mnt/path/to/decrypted'显然可以按预期工作。此后再次放下密钥,但是安装成功。这意味着我必须在服务器上实现“动态提示”(步骤1)。这已经是最好的解决方案,还是我也可以在客户端上实现?

    最佳答案

    今天,我在尝试准确了解您所描述的内容时,偶然发现了您的帖子,但没有找到任何帮助。我终于设法自己找到了解决方案。

    该解决方案将利用rsync的--rsync-path选项。这是man page的摘录:

        --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/
    

    07-24 12:43