JSch sftp Transfer Stripping Windows Окончания строк - PullRequest
2 голосов
/ 28 октября 2010

Мне кажется, я понимаю разницу между режимом ASCII и бинарным режимом при обычной передаче по FTP - в бинарном режиме файл копируется точно, а в режиме ASCII клиент может изменять окончания строк (удаление возврата каретки из Windows -> UNIX или добавив его в другом направлении). Однако я подумал, что протокол SFTP поддерживает только передачи в двоичном режиме; исходный файл не будет изменен.

Однако при использовании библиотеки JSch для копирования файла из Windows в UNIX окончания строк в стиле Windows удаляются. Это проблематично, потому что эти файлы извлекаются другими компьютерами Windows различными способами, и я не могу гарантировать, что их клиенты будут повторно добавлять возврат каретки перед каждым переводом строки.

Properties properties = new Properties();
properties.setProperty("StrictHostKeyChecking", "no");
Session session = jsch.getSession(UserName, Address, Port);
session.setPassword(Password);
session.setConfig(properties);
session.connect();
ChannelSftp channel = (ChannelSftp)session.openChannel("sftp");
channel.connect();
channel.
channel.cd(SCPDir);
channel.put(new ByteArrayInputStream(WindowsStyleString.getBytes()), FileName);
channel.disconnect();
session.disconnect();

Что я могу сделать, чтобы JSch точно передавал файлы? К сожалению, в документации не хватает, поэтому я не уверен, есть ли какой-либо параметр его или, возможно, какое-то дополнительное свойство SSH, которое я могу указать для дословной передачи. И почему это вообще происходит в первую очередь, когда модификации стиля режима ASCII не являются частью стандарта SFTP?

Ответы [ 2 ]

1 голос
/ 28 октября 2010

Еще один случай неправильного направления;Я извиняюсь за все эти неудовлетворительные вопросы.

Оказывается, что в Windows, где я могу отлаживать, вездесущий toString Java возвращает окончания строк с помощью возврата каретки и перевода строки (\ r \ n).На производственных серверах Linux toString возвращает только \ n.Тем не менее, при каждом использовании этих объектов toString, независимо от того, были ли они загружены через FTP (даже если хост также является машиной Linux), отправлены по электронной почте или использованы в запросах SQL, они автоматически добавляются \ r или не требуют этого.Но SFTP не сделал.

Так что я думаю, урок здесь состоит в том, что toString, вероятно, возвращает формат окончания строки, соответствующий платформе, который org.apache.commons.net.ftp.FTPClient в режиме ASCII добавитbefore \ n, даже если FTP-сервер размещен в Linux (или, возможно, этот сервер маскируется под Windows), и что электронная почта и SQL не особенно заботятся о том, какие окончания строк у них есть.

1 голос
/ 28 октября 2010

SFTP поддерживал только двоичный режим до версии 4 и в версии 4 и более поздних (5, 6) двоичный режим по-прежнему по умолчанию, хотя также доступен режим ASCII.Все, что JSh делает с вашим файлом, является его собственной инициативой.Может быть, он удаляет CR самостоятельно, или, может быть, сервер делает это, я не могу сказать наверняка, не видя никакого журнала, который выставляет Jsh или сервер.

...