我想使用 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”主机别名可以依赖主机身份?
我已经确定了我的问题的答案,但这有点痛苦。
首先,我更改了本地
~/.ssh/config
文件中的条目,使其看起来像这样:当然,这很容易。但是,这将不起作用,除非
sshd
在容器中配置为允许传入的ssh
客户端执行此SetEnv
命令。sshd
默认情况下未配置为允许此操作。因此,我必须编写一个脚本,每次启动时都可以在容器上调用该脚本,它会在我的台式计算机上运行 unison 之前执行以下操作:AcceptEnv UNISONLOCALHOSTNAME
到容器的末尾/etc/ssh/sshd_config
。或者:
更容易一点,我可以
/root/.bashrc
在容器中修改一个脚本放置在的顶部。
/root/.bashrc
(当我把它放在底部时它不起作用,.bashrc
因为.bashrc
如果 shell 不是交互式的,它会提前退出。)不幸的是,我不能只编辑
.bashrc
一次就完成它,因为每次启动容器时都会重新初始化根文件系统。因此,这种重写/root/.bashrc
必须通过一个脚本来完成,我要么保留在云服务提供的持久文件系统上。或者我可以.bashrc
通过桌面上使用ssh
并scp
进行更改的本地脚本来编辑容器。