【问题标题】:Does Erlang's ssh_sftp library provide for a way to listen for directory changes?Erlang 的 ssh_sftp 库是否提供了一种监听目录变化的方法?
【发布时间】:2018-11-26 23:28:34
【问题描述】:

我需要查看或收听 SFTP 服务器上的文件夹以了解任何更改。在未来的某个特定时间(我不知道什么时候),该文件夹将更新为一个文件。我将如何在该文件夹上设置侦听器或观察器,而不是每分钟 ping 一次,以便我知道它何时拥有该文件? Erlang 的ssh_sftp 模块是否为此提供了功能?

【问题讨论】:

  • 这不是ssh_sftp 模块的作用。你可以阅读这个相关的question

标签: erlang elixir


【解决方案1】:

SFTP 和 FTP 协议都没有任何机制来通知客户端远程文件夹中的更改。检测更改的唯一解决方案是定期枚举远程目录树并查找差异。

参考:https://winscp.net/eng/docs/library_example_watch_for_changes

【讨论】:

    【解决方案2】:

    我不知道你是否还需要它,但我已经实现了你所需要的。由于法律协议,我将无法共享代码,但我可以提示您实现它的方式。

    要求:每当文件到达目录时运行一个函数,而不是按定义的时间间隔轮询目录以提高处理效率。

    第 1 步:以 sftp 作为子系统启动 ssh 守护进程

    {ok, Pid} = ssh:daemon(Port, [{user_passwords, [{User, Pass}]},
                                  {system_dir, SystemDir},
                                  {user_dir, UserDir},
                                  {key_cb, cac_auth},
                                  {shell, {cacsftpd_server, display_info, []}},
                                  {subsystems, [ssh_sftpd:subsystem_spec([{cwd, 
                                   Home}, {file_handler, sftpd_file_handler}])]}])
    

    第 2 步:在 sftpd_file_handler 中,您可以在文件完全传输后应用触发器来调用您想要的处理程序;))。

    【讨论】:

      【解决方案3】:

      虽然不是在 Erlang 中,而是在 Elixir 中,但请看一下:https://github.com/Codenaut/exsftpd/blob/master/lib/sftpd_file_handler.ex

      必不可少的一点是写函数:

      defmodule Exsftpd.SftpFileHandler do
      ...
      
        def write(io_device, data, state) do
          {:file.write(io_device, data), state}
          my_custom_function(state)
          {:ok, state}
        end
      
      ...
      end
      

      在这里,您可以在将内容写入文件系统之后(或代替)调用您想要的任何函数。

      像这样初始化服务器:(有关更详细的示例,请参阅https://github.com/Codenaut/exsftpd/blob/master/lib/server.ex):

      :ssh.daemon(2222,
          system_dir: '/tmp/ssh',
          subsystems: [
            Exsftpd.SftpdChannel.subsystem_spec(
              file_handler: {Exsftpd.SftpFileHandler, []}
            )
          ],
          user_dir: '/tmp/ssh/users'
        )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-08
        • 1970-01-01
        相关资源
        最近更新 更多