PS:想直接看我的解決辦法,可以直接跳到 2.5 處,希望能幫到你
1.問題描述
當連接上SFTP服務器后,發現無法獲得所需要的文件,以及sftp調用cd方法出現異常
2.解決流程
2.1 因為策略問題,這個sftp服務器我本地代碼無法連接,在無數次嘗試后我索性在自己的阿里雲服務器上建了個SFTP服務器,用相同的代碼進行測試,如下:
測試文件所在路徑:/data/sftp/mysftp/upload

2.2 測試過程中,我首先研究了連接SFTP后如何獲取文件,前幾次嘗試是用File 獲取文件對象,代碼如下:
File file = new File(path+File.separator, uidName); System.out.println(file.getAbsolutePath()); FileInputStream input = null; if(file.exists()){ try { input = new FileInputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); } }
最后發現不管如何切換路徑,file.exists()返回都是false,也就是獲取失敗,於是研究了下,改用SFTP的方法來獲取文件,代碼如下:
String path = "/data/sftp/mysftp/upload"; directory = path; channelSft.cd(directory); // 所需文件名 String uidName = "test.txt"; InputStream inputStream = channelSft.get(uidName);
這種方法就是用CD切換到文件所在目錄,然后用sftp的get()方法來獲取輸入流,然后進行處理即可。
2.3 但是我測試的時候發現,我調用cd()方法時 用相對路徑可以訪問,絕對路徑無法訪問,直接使用絕對路徑會報錯 no such file,異常如下圖:

雖然不明白為什么相對路徑可行,絕對路徑不行,但至少應該能獲得文件資源了,我興沖沖的去公司的測試環境里測試,結果發現用相對路徑還是No Such File!!
2.4 到底是什么原因呢?我又用 ls()方法試試,發現ls是可以的,唯獨cd(xx)不行。 這個時候我懷疑是權限問題,還專門去了解了一下linux的文件權限怎么看,事實證明這和權限沒啥關系(因為命令行能訪問的部分,代碼里應該也是可以的),權限那部分小結暫時沒啥用我就貼在后面了。
2.5 后來,聽了別人給我的分析,我覺得不是權限就是路徑問題,既然排除了權限,就試試路徑對不對,我們可以用pwd命令用於顯示此文件的工作目錄(當前所在絕對路徑)。
命令如下:
[root@iZbp1hwh629hd4xz80i1z0Z upload]# sftp mysftp@120.xx.xxx.xxx mysftp@120.xx.xxx.xxx's password: Connected to 120.xx.xxx.xxx. sftp> ls upload sftp> cd upload sftp> ls test.txt sftp> pwd Remote working directory: /upload sftp>
可以看到,SFTP賬號登錄后用 pwd 命令打印出來的 路徑才是我們cd 操作所需的路徑!這個結果和文件的絕對路徑是不一樣的,我去試了試果然如此,問題就在這里。
// 用/upload可以順利訪問啦 String directory = "/upload"; channelSft.cd(directory);
關於Linux文件權限問題:
查看用戶權限:
groups 用戶名 :查看當前用戶所屬用戶組
cat /etc/group :查看所有用戶組
PS:若要cd進入一個目錄,該目錄的權限必須要有-x(可執行)權限。若還要ls出該目錄下的文件,那么該目錄同時還要必須有-r(可讀)權限。
查看文件權限:ll操作:
[root@iZbp1hwh629hd4xz80i1z0Z upload]# ll total 4 -rw-r--r-- 1 root root 12 Dec 31 22:10 test.txt
返回結果可以分成四部分看:'-','rw-', 'r--', 'r--',
其中的第一個字符表示的是文件類型(- 表示普通文件,d 表示目錄文件,c : 為字符串設備,如路由器等設備,這里就是個普通文件
剩下的分為三組,每組三個單位
第一組(rw-):表示文件所有者的權限,這里的test文件的所有者為root用戶,此處權限為 可讀,可寫
第二組(r--):文件所屬組的權限,上圖中的文件所屬組也為root組,此處為 可讀
第三組(r--):其他人的權限(跟本文件無關的人),此處為 可讀
