未通过FSEvents检测到sftp文件修改

时间:2013-07-20 14:20:29

标签: macos sftp fsevents

在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 config中使用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 个答案:

答案 0 :(得分:1)

不,你没有做错任何事。问题与你使用chroot有关;只需在chroot中运行sshd,我就可以在不涉及touch的情况下重现这一点。

FSEvents正在将事件记录在chroot中的路径上,例如/foo而不是/vhosts/web/user/foo

这几乎可以肯定是OS X的错误;你是否会让苹果很快修复它是另一回事。您最好的选择可能是使用Apple的沙盒(使用sftp-server运行sandbox-exec而不是chroot。)