【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--):其他人的权限(跟本文件无关的人),此处为 可读

原文地址:https://www.cnblogs.com/dabuliu/p/15754813.html