Весенняя интеграция мэйнфрейм sftp: не удалось записать файл; вложенное исключение - 3: в доступе отказано

Я пытаюсь перенести файл на мэйнфрейм, используя Spring интеграции sftp: исходящий-шлюз: это конфигурация:

<sftp:outbound-gateway id="putGateway"
        session-factory="sftpSessionFactory"
        request-channel="sftpFileInputChannel"      
        command="put"       
        expression="payload"    
        remote-directory="${remote.upload.directory}"     
        remote-filename-generator-expression="'${remote.upload.filename}'"      
        use-temporary-file-name="false"
        reply-channel="replayFromPutSftpChannel"/>

где

remote.upload.filename.credit.fmpl=/!DTS4.UP.G3TRF.S60304
remote.upload.directory=/

Я получаю исключение, как:

Caused by: org.springframework.integration.MessagingException: Failed to write to '//!DTS4.UP.G3TRF.S60304' while uploading the file
    at org.springframework.integration.file.remote.RemoteFileTemplate.sendFileToRemoteDirectory(RemoteFileTemplate.java:392)
    at org.springframework.integration.file.remote.RemoteFileTemplate.access$500(RemoteFileTemplate.java:56)
    at org.springframework.integration.file.remote.RemoteFileTemplate$1.doInSession(RemoteFileTemplate.java:213)
    ... 46 more
Caused by: org.springframework.core.NestedIOException: failed to write file; nested exception is 3: Permission denied
    at org.springframework.integration.sftp.session.SftpSession.write(SftpSession.java:158)
    at org.springframework.integration.file.remote.RemoteFileTemplate.sendFileToRemoteDirectory(RemoteFileTemplate.java:385)
    ... 48 more
Caused by: 3: Permission denied
    at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2629)
    at com.jcraft.jsch.ChannelSftp._put(ChannelSftp.java:545)
    at com.jcraft.jsch.ChannelSftp.put(ChannelSftp.java:491)
    at com.jcraft.jsch.ChannelSftp.put(ChannelSftp.java:454)
    at org.springframework.integration.sftp.session.SftpSession.write(SftpSession.java:155)

Если я загружаю из командной строки с помощью клиента sftp, работает следующее:

put filename //!DTS4.UP.G3TRF.S60304

но через весеннюю интеграцию это не так. Сервер, к которому я пытаюсь подключиться, это: мейнфрейм IBM z/OS.

Пожалуйста, помогите, если вы знаете, как решить проблему.

Спасибо анна

1 ответ

Чтобы продолжить то, что указал Артем, когда sFTPing, например, на облачный sFTP-сервер Axway, мне сказали, что текущий рабочий каталог был "/"

Сначала я использовал терминальный клиент sftp:

$ sftp username@mft-xxx.axwaycloud.com
sftp> pwd
Remote working directory: /

Это не root /, а chrooted каталог, так что я не могу определить абсолютный путь. Приведенный ниже код String ftpRemoteDestinationPath = "/" + tempFile.getName(); работает, хотя в этой ситуации:

    if (tempFile.exists()) {

        try {
            axwaySftpRemoteFileTemplate.execute((SessionCallback<ChannelSftp.LsEntry, Void>) session -> {

                String ftpRemoteDestinationPath = "/" + tempFile.getName();

                logger.info("FTP local file residing on server: [" + tempFile.getAbsolutePath() + "]");

                InputStream targetStream = new FileInputStream(tempFile);

                logger.debug("sftp uploading file: [" + tempFile.getName() + "] using channel connected to an sftp server :[" + session.getClientInstance().toString() + "]");
                session.write(targetStream, ftpRemoteDestinationPath);

                return null;
            });

        } catch (Exception e) {
            logger.error("Could not send file per SFTP: " + e);

            throw new SomeRuntimeSftpException("Error FTPing file " + tempFile.getAbsolutePath() + " " + e.getMessage());
        }
        finally {
            tempFile.delete();
        }
    }

Почему я получаю "Отказано в доступе на com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2297)"

Мы получили эту ошибку, потому что на некоторых серверах sftp "/" означало корень домашнего каталога пользователя, а на других это буквально означало корень сервера, на который у пользователя явно не было разрешений на запись. Мы также получили это на некоторых серверах sftp, когда каталог, в который пользователь пытался записать, не существовал.

Еще одна квета:

У меня возникла проблема также с SFTP, и я выяснил, что в параметрах FTP File Writer в поле справа от имени или адреса ftp-сервера необходимо указать полный путь к папке, в которую вы хотите поместить файлы. в. В противном случае MIRTH SFTP пытается изменить каталог на / и получает отказано в разрешении. например. sftp:// 111.222.333.444 / foldera/folderb/folderc/

Чтобы выяснить, что такое папка / folderb / folderc /, следует использовать какой-нибудь SFTP-клиент, который работает (не MIRTH), и при подключении он должен показать путь к папкам, в которых вы находитесь.

Это сработало для меня.

Итак, ваша проблема, что ваш путь SFTP начинается с /, Код из ChannelSftp.put:

dst=remoteAbsolutePath(dst);
...
private String remoteAbsolutePath(String path) throws SftpException{
   if(path.charAt(0)=='/') return path;
   String cwd=getCwd();
   if(cwd.endsWith("/")) return cwd+path;
   return cwd+"/"+path;
}

Попробуйте выяснить, как избежать / в начале.

Другие вопросы по тегам