使用 Unison 将我的桌面计算机与云中的容器同步

使用 Unison 将我的桌面计算机与云中的容器同步

我想使用 Unison 在我的桌面计算机和云中的容器之间同步目录。我使用 Unison 进行这种工作,但我看到的问题是,每次启动容器时,它都可以有不同的主机名和 IP 号,并且 sshd 将在不同的端口号上运行。

为了使这对我来说基本上是透明的,每次启动容器时,我都会编辑 ~/.ssh/config 文件,如下所示:

Host pod
   User root
   Hostname 184.26.5.182
   Port 10666

我相应地替换了 IP 号和端口号。

完成此操作后,我可以使用ssh pod等登录到容器。我可以毫无问题地运行 rsync 内容的脚本,即使它们将主机别名“pod”硬连线到其中。 (如果我知道如何使 rsync 与删除进行双向同步,那么我就会使用它,但我很确定这是不可能的。)

我的 Unison 配置文件如下所示:

root = /Users/me/path/to/dir
root = ssh://pod//path/to/dir
 
ignore = Path subdir1
ignore = Path subdir2

不幸的是,这效果不太好,因为每次我启动容器时,我都会得到不同的端口号(IP 号通常不会改变),并且 Unison 认为这是一次新的同步。这根本不是我想要的。

有没有办法告诉 Unison 忽略远程容器似乎已更改为另一台计算机的事实,并只相信我的“pod”主机别名可以依赖主机身份?

答案1

我已经确定了问题的答案,但这有点痛苦。

首先,我更改了本地文件中的条目~/.ssh/config,使其如下所示:

Host pod
   User root
   SetEnv UNISONLOCALHOSTNAME=pod
   Hostname 184.26.5.182
   Port 10666

当然,这很容易。但是,除非sshd在容器中配置为允许传入ssh客户端执行此SetEnv命令,否则这将不起作用。sshd不是默认情况下配置为允许这样做。因此,我必须编写一个脚本,每次启动容器时都可以在容器上调用该脚本,该脚本在我在桌面计算机上一致运行之前执行以下操作:

  1. 将该行添加AcceptEnv UNISONLOCALHOSTNAME到容器的/etc/ssh/sshd_config.
  2. 告诉容器的 sshd 通过执行以下操作重新加载其配置文件
kill -HUP `cat /var/run/sshd.pid`

或者:

更简单一点,我可以/root/.bashrc在容器中修改一个脚本

export UNISONLOCALHOSTNAME=pod

放置在顶部/root/.bashrc。 (当我将它放在 的底部时,它不起作用,.bashrc因为事实证明,.bashrc如果 shell 不具有交互性,则其中的代码会提前退出。)

不幸的是,我不能只编辑.bashrc一次并完成它,因为每次容器启动时根文件系统都会重新初始化。因此,这种重写/root/.bashrc必须通过我保留在云服务提供的持久文件系统上的脚本来完成。或者,我可以.bashrc通过桌面上使用sshscp进行更改的本地脚本来编辑容器。

相关内容