Erlang的ssh_sftp库是否提供了一种监听目录更改的方法?

时间:2017-02-07 21:28:07

标签: erlang elixir

我需要在SFTP服务器上观看或收听文件夹以进行任何更改。在将来的某个特定时间(我不知道何时),文件夹将使用文件进行更新。我不是每分钟都ping一次,而是如何在该文件夹上设置一个监听器或观察者,以便我知道它何时有该文件? Erlang的ssh_sftp模块是否为此提供了一个函数?

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

要求:每当文件登陆目录时运行一个函数,而不是以定义的间隔轮询目录以使处理有效。

步骤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中,您可以在文件完全传输后应用触发器来调用所需的处理程序;))。

答案 2 :(得分:0)

虽然不在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'
  )