我想使用 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
是不是默认情况下配置为允许这样做。因此,我必须编写一个脚本,每次启动容器时都可以在容器上调用该脚本,该脚本在我在桌面计算机上一致运行之前执行以下操作:
- 将该行添加
AcceptEnv UNISONLOCALHOSTNAME
到容器的/etc/ssh/sshd_config
. - 告诉容器的 sshd 通过执行以下操作重新加载其配置文件
kill -HUP `cat /var/run/sshd.pid`
或者:
更简单一点,我可以/root/.bashrc
在容器中修改一个脚本
export UNISONLOCALHOSTNAME=pod
放置在顶部的/root/.bashrc
。 (当我将它放在 的底部时,它不起作用,.bashrc
因为事实证明,.bashrc
如果 shell 不具有交互性,则其中的代码会提前退出。)
不幸的是,我不能只编辑.bashrc
一次并完成它,因为每次容器启动时根文件系统都会重新初始化。因此,这种重写/root/.bashrc
必须通过我保留在云服务提供的持久文件系统上的脚本来完成。或者,我可以.bashrc
通过桌面上使用ssh
并scp
进行更改的本地脚本来编辑容器。