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