当远程计算机连接时,如何激活远程 SMB 共享的挂载?
这更多的是关于识别由特定远程计算机的连接触发的本地事件,而不是针对该事件采取的操作。能确定的是端口和协议,当然也可能是源IP,也许还有它的MAC。
为了说明这一点,假设有两台名为 Blue 和 Green 的 Windows 笔记本电脑,每台笔记本电脑都有一个名为 Data 的共享,它们偶尔会连接到名为 Martini 的 Linux Samba 服务器。目标是当 Blue 连接时,Martini 将 \Blue\Data 挂载到 /srv/blue(或任何地方)(并执行其他操作),并将 \Green\Data 挂载到 /srv/green(或任何位置)(并执行其他操作) )当绿色连接时。
也许我陷得太深了,但这似乎比看起来更难。
当本地主机连接到远程共享时,挂载远程共享非常简单,例如,当马蒂尼启动时,做它的事情,发现蓝色和绿色正在运行,并安装他们的股票。
我什至已经弄清楚如何在虚拟机启动时激活虚拟机上共享的主机挂载(创建一个监视虚拟机日志文件的 systemd.path 单元,然后在 fstab 中创建 x-systemd.requires=foo.path )。
然而,对于完全远程的机器,我却一片空白。有一种通过 iptables LOG 目标和 rsyslog (直接或通过 systemd.path 单元)的迂回 / Rube Goldberg 方式,但有太多移动部分,看起来像是一个拼凑。希望存在更直接的东西。
套接字激活可以关注端口,但(我很容易错)显然无法识别连接的机器。 Udev 激活似乎只集中在本地主机的硬件上。我还没有弄清楚客户端的 /dev、/proc 或其他要检查的路径,尽管我很容易错过一些东西。也许 /etc/samba/smb.conf 中有一些东西。
在进一步追尾之前,我想我应该发帖看看社区可能有什么想法。任何意见将不胜感激。
答案1
也许我陷得太深了,但这似乎比看起来更难。
您是完全正确的:在 SMB 协议级别上,它确实比用户角度看起来更难!
单个 SMB 客户端主机可以并行使用多个 TCP 连接,如果连接在未主动使用时中断(例如,由于网络错误或长时间不活动),则客户端可以在再次需要该连接时“无缝”重新连接,同时让用户感觉连接一直处于活动状态。
除其他外,这些因素可能会导致您很难或不可能通过简单地解析 Samba 日志来完成您所要求的任务。
您可能会或可能不会关心触发您的这种可能性事物可能并行多次,或者当“新连接”实际上是现有连接的重建时不必要。
要访问必要的协议详细信息以便您可以识别并避免这些问题,您可能必须编写自定义 Samba VFS 模块这将允许你挂钩你的事物适当的协议事件,并维护必要的状态信息以避免误触发。
从上面链接的文档中:
请注意,如果您的 VFS 模块应仅在第一次连接时执行连接时操作,并在最后一次断开连接时执行断开时操作,则您应该在模块中仔细管理。如果您配置多个共享来使用 VFS 模块,您应该注意,对于用户连接到的每个此类共享,您的连接和断开连接函数将被调用一次。
同样,由于 Samba 使用分叉模型,每个客户端都有一个单独的 smbd,因此将在每个 smbd 中为使用客户端连接到的模块的每个共享调用您的 connect 函数。
启动 Samba VFS 模块编程项目来满足您的需求的建议可能不是您想要的,但根据您提出的要求,我知道没有其他解决方案可以称为甚至有点可靠。
我对通过解析 Samba 日志来触发你的事物:根据各种详细信息,您可能需要将 Samba 日志级别提高到如此高的水平才能获得适合您目的的事件,以致生成的日志量可能会迫使您将一个问题换成另一个问题。
我相信你现在明白为什么我试图“尽一切努力”来寻求替代方法的可能性。