2013-07-20 40 views
1

在OSX 10.8.x上,我使用FSEvents檢測目錄中的更改。 問題是,當通過sftp複製文件時,不會調用FSEvents回調。
當我使用cp複製文件(或touch來模擬更改)時,調用回調。 我在做一些愚蠢的事情嗎?是sshd使用某種低級別的API來創建文件?我應該向蘋果公司提交一個錯誤嗎?未通過FSEvents檢測到sftp文件修改

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 

回答

1

不,你沒有做錯什麼。這個問題與你使用chroot有關。我完全可以在不涉及sshd的情況下重現此操作,只需在chroot中運行touch即可。

FSEvents將記錄事件發生在chroot中的路徑上,例如/foo而不是/vhosts/web/user/foo

這幾乎肯定是一個OS X的bug;不管你是否打算讓蘋果公司很快解決這個問題都是另一回事。你最好的選擇是使用蘋果的沙盒(運行sftp-serversandbox-exec),而不是chroot。

+0

它是有道理的(種)。但你怎麼知道事件發生在chroot路徑上?如果是這樣的話,我不應該通過觀​​看/ foo路徑來獲取事件嗎?但它不起作用。 – FKDev

+0

/foo也必須存在於基本文件系統中,否則事件將不會被傳送。真的,我不認爲值得努力解決這個錯誤。 –

+0

你是對的,但現在你已經把這個想法放在我的腦海裏了,我想驗證它,以至於所有的時間都浪費在這個上面,至少會產生一個正在發生的邏輯解釋。我創建了/ foo目錄,並且給了它正確的權限,但它仍然不起作用。所以我的猜測是這只是Apple實施中的一個奇怪的邊緣案例。 – FKDev