在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
答案 0 :(得分:1)
不,你没有做错任何事。问题与你使用chroot有关;只需在chroot中运行sshd
,我就可以在不涉及touch
的情况下重现这一点。
FSEvents正在将事件记录在chroot中的路径上,例如/foo
而不是/vhosts/web/user/foo
。
这几乎可以肯定是OS X的错误;你是否会让苹果很快修复它是另一回事。您最好的选择可能是使用Apple的沙盒(使用sftp-server
运行sandbox-exec
而不是chroot。)