我们想用来unison
同步两台服务器。从命令行和 bash 文件中,以下命令可以正常工作:
unison -batch /var/www/html/test ssh://host-2//var/www/html/test
文件正在同步并unison.log
正在更新。到目前为止,一切都很好。
与首选项文件结合使用,例如并简单地从命令行.unison/default.prf
执行,如所述unison
这里,一切工作也很好。
我们还安装了incrond
inotify cron 守护进程,并且运行顺利。以下 cron 作业执行得很好:
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE touch /root/test
/root/test
每次我对文件进行更改时都会更新/var/www/html/test
到目前为止,一切都很好!但使用 incrontab 唯一不起作用的是:
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE unison
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/bin/unison
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/local/sbin/unison
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE unison -batch /var/www/html/test ssh://host-2//var/www/html/test
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/bin/unison -batch /var/www/html/test ssh://host-2//var/www/html/test
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/local/sbin/unison -batch /var/www/html/test ssh://host-2//var/www/html/test'
文件中没有显示任何内容unison.log
,更不用说更新远程服务器了。以下内容也不会输出任何内容。
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE unison &> /root/test.log
/root/test.log
甚至还没有被创建。
使用名为“也”的批处理文件进行的另一个测试sync.sh
不起作用。
在 incrontab 中:
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /root/sync.sh
并在sync.sh
:
#!/bin/bash
touch /root/test
/usr/bin/unison -batch /var/www/html/test ssh://host-2//var/www/html/test
再次,/root/test
触摸得很好,这意味着每次我更新 中的文件时 inofify 都可以很好地工作/var/www/html/test
,但再次没有任何结果unison
。
/var/log/cron 看起来像这样:
May 21 06:33:44 Host-1 incrond[28339]: (root) CMD (sh /root/sync.sh)
并且unison.log
根本没有更新。
结论:
inotify
工作正常,检测文件系统中的每个更改并执行任务(任何unison
任务除外)。unison
除非由incrond
守护进程调用,否则可以在命令行和批处理中正常工作。
我是否忽略了什么?
答案1
为了建立 SSH 连接,客户端需要向服务器进行身份验证。您可能正在使用基于密钥的身份验证,密钥存储在受密码保护的文件中并加载到 SSH 代理中。 SSH客户端知道如何通过环境变量找到代理SSH_AUTH_SOCK
。在 cron 或 incron 作业中,环境与交互式会话中的环境不同,它是一个非常小的环境,没有SSH_AUTH_SOCK
,因此 SSH 客户端无法连接到远程计算机。
如果无法建立 SSH 连接,Unison 甚至不会开始寻找要同步的文件,并且不会向unison.log
.
脚本的标准错误有错误消息,但您没有将它们记录在任何地方。exec 2>&1 >>~/.unison-sync.log; date
在脚本的开头添加类似的内容。
要使 SSH 连接正常工作,您需要安排 Unison 作业访问您的代理,或者设置无密码密钥。如果您想通过代理,请参阅无法在 Crontab 中使用 shell 脚本 ssh 到远程计算机;但只有在您登录时它才有效。如果您希望同步始终有效,无密码密钥是唯一的解决方案。由于您以 root 身份运行 Unison 和 SSH,因此私钥需要位于 中/root/.ssh
,而不是位于您的帐户中。这同样适用于 中的任何相关选项.ssh/config
。在服务器端,您可以授权公钥仅运行带有command=…
指令的特定一致命令.ssh/authorized_keys
(请参阅创建一个只执行一个命令的 UNIX 帐户举个例子)。由于命令限制,如果有人获得本地 root 帐户的访问权限,他们将只能在 ;unison …
上运行该特定命令host-2
。我不知道 Unison 是否可以被欺骗以这种方式执行任意代码。