![服务器能否向客户端发送信号以在没有 SSH 反向隧道的情况下运行脚本?](https://linux22.com/image/98572/%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%83%BD%E5%90%A6%E5%90%91%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%8F%91%E9%80%81%E4%BF%A1%E5%8F%B7%E4%BB%A5%E5%9C%A8%E6%B2%A1%E6%9C%89%20SSH%20%E5%8F%8D%E5%90%91%E9%9A%A7%E9%81%93%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC%EF%BC%9F.png)
我正在尝试为自己设置一个轻量级的自定义文件同步系统。我希望服务器能够监视给定文件夹的更改(使用inotify -m
),并在检测到任何更改时将其传播到与其连接的客户端。
我的第一个想法是让客户端计算机启动 SSH 隧道(使用ssh -R 2222:127.0.0.1:22
),然后让服务器在适当的时候将文件发送回客户端。但为了使该过程自动化,我需要设置 SSH 密钥,这意味着如果服务器在我不知情的情况下受到损害,我的计算机也会依次暴露。我知道有一些方法可以减轻这些风险,例如 chroot Jail 或斯波利,但是开一个大洞只是为了把它补回来 99% 似乎有点笨拙。
我发现安全问题是由于允许服务器推送给客户端,而不是拥有客户端从服务器拉取。那么是否有任何其他程序或协议可以用来打开隧道,以便隐藏在动态 IP 和家庭路由器后面的客户端可以监视给定端口以获取来自服务器的信号没有像 SSH 隧道那样开放它以进行操作?
答案1
首先,请注意任何自制的“信号解决方案”都可能具有不明显的竞争条件。请注意,在处理最后一个信号时不要错过任何信号!
一个简单的想法可能是您的服务器会将行附加到本地文件中。所以每个 inotify 都会导致:
date +"%s" >> /path/to/sync-signals.log
在您的客户端上,通过 ssh/tail 观看该文件,但任何拉取操作都会在客户端上调用。
ssh server "tail -n1 -f /path/to/sync-signals.log" | while read -r sigdate; do
pull from server
done
请注意,此解决方案不应错过任何“信号”,但如果服务器在短时间内附加太多信号,则可能会导致大量不必要的“拉动”。因此,客户端 while 循环还应该以某种方式将最后一个“sigdate”与当前日期进行比较。或者更好的是,服务器会以某种方式延迟信号(如果几秒钟后没有任何变化,则仅附加一行。)