Весенняя интеграция мэйнфрейм 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;
}
Попробуйте выяснить, как избежать /
в начале.