2013-04-17 111 views
1

當上一個目錄不在根目錄(ftp home)中時,JSch的SFTP通道無法更改目錄。它只發生在一些SFTP服務器上,而不是全部。JSCH(SFTP)在子目錄級別(第二級別)上更改目錄時失敗

例如目錄結構是這樣的:

  • /
    • 1級
      • 2級

cd level-1(OK)
cd level-2(失敗)

它拋出這樣

4: Folder not found: /level-1/level-2 
    at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2569) 
    at com.jcraft.jsch.ChannelSftp._realpath(ChannelSftp.java:2100) 
    at com.jcraft.jsch.ChannelSftp.cd(ChannelSftp.java:315) 

錯誤的SFTP服務器返回/真實路徑根異常。另一臺未失敗的服務器返回完整路徑列表/usr/account

+0

不應該標題爲「(第二級)」嗎? –

+0

好眼睛!更正了標題(發送級別 - >第二級別)。這是一個錯字。謝謝。 – user2292916

回答

1

我找到了JSCH 0.1.49的源代碼並追蹤它。我發現有一個名爲_realPath的方法,當服務器無法返回實際路徑時會拋出異常。 該方法的輸入參數是遠程文件夾的絕對路徑所以我評論了異常,並返回絕對路徑。一切正常。

這是修改後的代碼。請注意,大多數情況下原始代碼都是可用的,我所做的更改僅適用於服務器無法返回第二級目錄(子文件夾)上的實際路徑的罕見情況,並且無法保證它適用於所有服務器。

//com.jcraft.jsch.ChannelSftp 
private byte[] _realpath(String path) throws ... { 
... 
if (type == SSH_FXP_STATUS) { 
    i = buf.getInt(); 
    /* Some servers fail to return the realPath 
    on second level of directory (subfolders). 
    original code is commented out and replaced with a return.*/ 
    //throwStatusError(buf, i); 
    return (path.getBytes()); 
} 
... 
1

我看起來像服務器端問題/ bug。服務器可能錯誤地執行SSH_FXP_REALPATH請求。

您登錄的帳號是chrooted嗎?誰在做chrooting,SFTP服務器還是系統級別的chroot?

如果您共享日誌文件,可能會得到更具體的答案。

在輸入目錄(許多客戶端不需要)時,您可能還會嘗試其他一些遵循SFTP規範並使用SSH_FXP_REALPATH請求的SFTP客戶端。它不一定是Java庫。任何客戶端,甚至GUI,都可以。只是爲了測試,如果它陷入了同樣的麻煩。例如WinSCP使用SSH_FXP_REALPATH。試着連接並輸入/level-1/level-2(我是WinSCP的作者)

+0

感謝Martyn,這是服務器端的錯誤。不幸的是,我沒有訪問服務器,我不得不在客戶端修復它。我找到了解決方案。 – user2292916