1. 程式人生 > 其它 >【linux sftp 和cd路徑no such file 問題篇】

【linux sftp 和cd路徑no such file 問題篇】

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--):其他人的許可權(跟本檔案無關的人),此處為 可讀