2

在 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
4

1 回答 1

1

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

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

这几乎可以肯定是一个 OS X 错误。您是否要让Apple尽快修复它是另一回事。您最好的选择可能是使用 Apple 的沙盒(使用 运行sftp-serversandbox-exec而不是 chroot。

于 2013-07-20T20:04:48.037 回答