zoukankan      html  css  js  c++  java
  • 【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--):其他人的权限(跟本文件无关的人),此处为 可读

  • 相关阅读:
    [MySQL] 数据库基本概念
    [LeetCode] Number of 1 Bits
    [LeetCode] Maximum Subarray
    [LeetCode] Search Insert Position
    [LeetCode] Remove Duplicates from Sorted List
    [LeetCode] Path Sum III
    [LeetCode] Not Boring Movies
    [LeetCode] Swap Salary
    [LeetCode] Big Countries
    中国银联全渠道系统商户接入 测试指引-银联网关支付产品
  • 原文地址:https://www.cnblogs.com/dabuliu/p/15754813.html
Copyright © 2011-2022 走看看