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

Macos 未通过FSEvents检测到sftp文件修改,macos,sftp,fsevents,Macos,Sftp,Fsevents,在OSX 10.8.x上,我使用FSEvents来检测目录中的更改。 问题在于,通过sftp复制文件时,不会调用FSEvents回调。 当我使用cp复制文件(或touch模拟更改)时,将调用回调。 我在做傻事吗?sshd是否使用某种低级API来创建文件?我应该向苹果提交一个bug吗 eventQueue = dispatch_queue_create(EVENT_QUEUE_NAME, DISPATCH_QUEUE_SERIAL); //Watch the data/apns director

在OSX 10.8.x上,我使用FSEvents来检测目录中的更改。 问题在于,通过sftp复制文件时,不会调用FSEvents回调。
当我使用
cp
复制文件(或
touch
模拟更改)时,将调用回调。 我在做傻事吗?sshd是否使用某种低级API来创建文件?我应该向苹果提交一个bug吗

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配置中使用内部sftp:

...
Subsystem sftp internal-sftp

Match Group users
PasswordAuthentication yes
AllowTCPForwarding no
X11Forwarding no
ForceCommand internal-sftp
Match User user
ChrootDirectory /vhosts/web/user

不,你没有做错什么。问题与您使用chroot有关;通过在chroot中运行
touch
,我完全可以在不涉及
sshd
的情况下重现这一点

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


这几乎肯定是一个OSX错误;你是否打算让苹果公司尽快修复它是另一回事。您最好的选择可能是使用苹果的沙盒(与沙盒执行器一起运行
sftpserver
),而不是chroot。

这是有意义的(有点)。但是你怎么知道这件事发生在这条小路上呢?如果是这样的话,我难道不能通过观看/foo路径来获取事件吗?但是它不起作用。/foo还必须存在于基本文件系统中,否则事件将无法传递。真的,我不认为有必要努力解决这个错误。你是对的,但是现在你已经把这个想法放在我的脑海里了,我想验证一下,这样所有浪费在这个问题上的时间至少可以对正在发生的事情给出一个合乎逻辑的解释。我已经创建了/foo目录,并且给了它正确的权限,但它仍然无法工作。所以我的猜测是,这只是苹果实施中一个奇怪的边缘案例。现在我要说的是服务器故障,因为我对sftp+sandbox exec有疑问,尽管我可能应该使用kqueue。我能说的是,它在10.8.4上对我有效(我尝试使用的确切目录是/private/var/tmp/net和/net)。祝你好运:-)