【发布时间】:2018-11-26 23:28:34
【问题描述】:
我需要查看或收听 SFTP 服务器上的文件夹以了解任何更改。在未来的某个特定时间(我不知道什么时候),该文件夹将更新为一个文件。我将如何在该文件夹上设置侦听器或观察器,而不是每分钟 ping 一次,以便我知道它何时拥有该文件? Erlang 的ssh_sftp 模块是否为此提供了功能?
【问题讨论】:
-
这不是
ssh_sftp模块的作用。你可以阅读这个相关的question。
我需要查看或收听 SFTP 服务器上的文件夹以了解任何更改。在未来的某个特定时间(我不知道什么时候),该文件夹将更新为一个文件。我将如何在该文件夹上设置侦听器或观察器,而不是每分钟 ping 一次,以便我知道它何时拥有该文件? Erlang 的ssh_sftp 模块是否为此提供了功能?
【问题讨论】:
ssh_sftp 模块的作用。你可以阅读这个相关的question。
SFTP 和 FTP 协议都没有任何机制来通知客户端远程文件夹中的更改。检测更改的唯一解决方案是定期枚举远程目录树并查找差异。
参考:https://winscp.net/eng/docs/library_example_watch_for_changes
【讨论】:
我不知道你是否还需要它,但我已经实现了你所需要的。由于法律协议,我将无法共享代码,但我可以提示您实现它的方式。
要求:每当文件到达目录时运行一个函数,而不是按定义的时间间隔轮询目录以提高处理效率。
第 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 中,您可以在文件完全传输后应用触发器来调用您想要的处理程序;))。
【讨论】:
虽然不是在 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'
)
【讨论】: