在sftp中使用“ put”命令没有给出这样的文件或目录3:权限被拒绝

时间:2018-07-23 20:19:09

标签: java sftp jsch

我正在尝试使用JSch从sftp服务器检索一些文件,但是出现以下错误。

ls: cannot access /export/user-docs/adminuser/record/WAQ12.txt: No such file or directory
    3: Permission denied, file: /opt/ftp/pub/new_waq_std/WAQ12.txt
    @at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2873)
    @at com.jcraft.jsch.ChannelSftp.put(ChannelSftp.java:768)
    @at com.jcraft.jsch.ChannelSftp.put(ChannelSftp.java:709)
    @at com.jcraft.jsch.ChannelSftp.put(ChannelSftp.java:703)

代码如下:

class WSFTPFile {
       static WSFTPFile ftpFile =null;
        private static ChannelSftp sftp;
        private static Session jschSession;
       WSDBTool dbTool= null;
           boolean stickyCRLF=false;
           boolean seenCR=false;

       public static WSFTPFile getInstance(){
           if (ftpFile == null)
              ftpFile =  new WSFTPFile();
           return ftpFile;
       }

       public void performFTP(Vector<String> v) throws Exception {

             /*SFTP Coding start */
            int authResult = -1;
             JSch jsch = new JSch();

            try{

            jsch.addIdentity(dbTool.getSourceDirectory()
                    + "id_rsa_1234.wsadmin");

            jschSession = (Session) jsch.getSession(dbTool.getFTPUserName(),
                    dbTool.getFTPIP(), 22);
            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");
            jschSession.setConfig(config);
            jschSession.connect();
            System.out.println("Host connected.");

            }catch(Exception e) {
                System.out.println("Exception in connecting to SFTP server.");
                e.printStackTrace();
            }
            // SftpClient sftp;
            System.out.println("authResult:" + authResult);

                if (jschSession.isConnected()) {    
                try{
                    sftp = (ChannelSftp)jschSession.openChannel("sftp") ;
                    sftp.connect();
                    //sftp = sshClient.openSftpClient();
                    sftp.lcd(dbTool.getSourceDirectory());
                    sftp.cd(dbTool.getFileDirectory());

                    sftp.put(dbTool.getSourceDirectory()+dbTool.getFileName(),dbTool.getFileName(),ChannelSftp.OVERWRITE);
                    if(sftp != null) {
                        sftp.disconnect();  
                        sftp.quit();
                        sftp = null;
                    }
                    System.out.println("Successfully connected to ws  SFTP area..");
                }catch(Exception e){
                    System.out.println("Exception in SFTP put.");
                    e.printStackTrace();
                }
            }else{
                System.out.println("Error connecting SFTP server.");
            }
                if(jschSession != null){
                     jschSession.disconnect();
                     jschSession = null;
                }
             /*SFTP Coding END*/
            System.out.println("File sent to ws  via SFTP");
        }
        }

以下是我在ftp目录中运行ls -alF时得到的内容:-

-rw-r--r-- 1 ssrftp ssssftp 3135 5月16日17:00 WAQ12.txt

但是我现有的WAQ12.txt在ftp位置大约有2个月大了,在尝试执行ftp时会出现上述错误。文件日期重要吗?任何想法?   注:-为了进行测试,我删除了/export/user-docs/adminuser/record/WAQ12.txt位置中的现有WAQ12.txt并运行了我的程序,它运行正常,并在ftp位置中填充了WAQ12.txt文件,再次,当我运行程序时,它确实覆盖了先前的WAQ12.txt,并且时间戳得到了更新。

但是我不想这么做,我希望在运行程序时,以前的WAQ12.txt(已存在2个月)文件被新文件覆盖,但是我仍然收到上述错误。有想法吗?

1 个答案:

答案 0 :(得分:-1)

确保ftp用户也对该目录具有写权限。替换现有文件时,put命令首先删除然后上传有问题的文件。如果您对目录没有写权限,则删除部分将失败。

使用chmod命令更改权限。为了进行测试,您可以尝试sudo chmod a+w .授予所有用户对该目录的写权限。如果可行,请将权限设置调整到尽可能小的范围,例如只有组文本sftp用户属于。