【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--):其他人的權限(跟本文件無關的人),此處為 可讀

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM