未通过 FSEvents 检测到 sftp 文件修改
Posted
技术标签:
【中文标题】未通过 FSEvents 检测到 sftp 文件修改【英文标题】:sftp file modifications not detected via FSEvents 【发布时间】:2013-07-20 14:20:28 【问题描述】:在 OSX 10.8.x 上,我使用 FSEvents 来检测目录中的更改。
问题是当通过 sftp 复制文件时,不会调用 FSEvents 回调。
当我使用cp
复制文件(或touch
模拟更改)时,将调用回调。
我在做傻事吗? sshd 是否使用某种低级 API 来创建文件?我应该向 Apple 提交错误吗?
eventQueue = dispatch_queue_create(EVENT_QUEUE_NAME, DISPATCH_QUEUE_SERIAL);
//Watch the data/apns directory (for .json files)
NSString *pathToWatch = ...
NSArray *pathsToWatch = @[pathToWatch];
CFAbsoluteTime latency = 1.0; /* Latency in seconds */
// Create the FileSystem events stream, passing in a callback
streamRef = FSEventStreamCreate(NULL,
&fscallback,
NULL,
(__bridge CFArrayRef)(pathsToWatch),
kFSEventStreamEventIdSinceNow,
latency,
kFSEventStreamCreateFlagIgnoreSelf);
if (streamRef)
FSEventStreamSetDispatchQueue(streamRef, eventQueue);
if (NO == FSEventStreamStart(streamRef))
DDLogError(@"FSEventStreamStart error");
else
DDLogError(@"FSEventStreamStart ok");
else
DDLogError(@"FSEventStreamCreate error");
我在 sshd 配置中使用 internal-sftp:
...
Subsystem sftp internal-sftp
Match Group users
PasswordAuthentication yes
AllowTCPForwarding no
X11Forwarding no
ForceCommand internal-sftp
Match User user
ChrootDirectory /vhosts/web/user
【问题讨论】:
【参考方案1】:不,你没有做错任何事。问题与您使用 chroot 有关;我能够在不涉及 sshd
的情况下重现这一点,只需在 chroot 中运行 touch
。
FSEvents 将事件记录为发生在 chroot 中的路径上,例如 /foo
而不是 /vhosts/web/user/foo
。
这几乎可以肯定是一个 OS X 错误;您是否要让Apple尽快修复它是另一回事。您最好的选择可能是使用 Apple 的沙盒(运行 sftp-server
和 sandbox-exec
)而不是 chroot。
【讨论】:
这是有道理的(有点)。但是你怎么知道事件发生在 chrooted 路径上?如果是这种情况,我不应该通过观看 /foo 路径来获取事件吗?但它不起作用。 /foo 也必须存在于基本文件系统中,否则事件将不会被传递。真的,我认为解决这个错误不值得。 你是对的,但是现在你已经把这个想法放在我的脑海里,我想验证它,以便所有浪费在这上面的时间至少可以对正在发生的事情产生一个合乎逻辑的解释。我已经创建了 /foo 目录,并赋予了它正确的权限,但它仍然无法正常工作。所以我的猜测是这只是 Apple 实施中的一个奇怪的边缘案例。 现在我要去服务器故障,因为我有关于 sftp+sandbox-exec 的问题,虽然我可能应该使用 kqueue。 我只能说它在 10.8.4 上对我有用(我尝试使用的确切目录是 /private/var/tmp/net 和 /net)。祝你好运:-)以上是关于未通过 FSEvents 检测到 sftp 文件修改的主要内容,如果未能解决你的问题,请参考以下文章
php 如何通过连接sftp并下载sftp服务器指定目录下的所有文件到本地?