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