【问题标题】:JSch sftp Transfer Stripping Windows Line EndingsJSch sftp 传输剥离窗口行尾
【发布时间】:2011-05-01 15:13:28
【问题描述】:

我想我了解常规 FTP 传输中 ASCII 模式和二进制模式之间的区别——在二进制模式下,文件被精确复制,而在 ASCII 模式下,客户端可以修改行尾(从 Windows -> UNIX 中删除回车或将其添加到另一个方向)。但是,我认为 SFTP 协议只支持 Binary 模式风格的传输;源文件不会被修改。

但是,当使用 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 标准的一部分时,为什么会发生这种情况?

【问题讨论】:

标签: java sftp line-endings jsch


【解决方案1】:

另一个误导的案例;对于所有这些不满意的问题,我深表歉意。

事实证明,在我可以调试的 Windows 上,Java 无处不在的 toString 返回带有回车和换行 (\r\n) 的行尾。在 Linux 生产服务器上,toString 仅返回 \n。但是,我对这些 toString 对象的每次使用,无论是通过 FTP 上传(即使主机也是 Linux 机器)、通过电子邮件发送,还是在 SQL 查询中使用,都自动附加 \r 或不需要它。但 SFTP 没有。

所以我想这里的教训是 toString 可能返回一个适合平台的行结束格式,即使 FTP 服务器是托管在 Linux 上(或者该服务器可能伪装成 Windows),并且电子邮件和 SQL 并不特别关心它们有哪些行尾。

【讨论】:

  • 有点晚了,但如果你说的是toString(),那么你也应该说你在说哪个班级。默认的Object.toString() 结果不包含任何行尾。
【解决方案2】:

SFTP 在版本 4 之前仅支持二进制模式,在版本 4 和更高版本 (5, 6) 中,二进制模式仍然是默认的,尽管 ASCII 模式也可用。无论 JSh 对你的文件做什么都是它自己的主动性。也许它会自行剥离 CR,或者服务器会这样做,如果没有看到 Jsh 或服务器公开的任何类型的日志,我不能肯定地说。

【讨论】:

  • 我掩盖了 JSch 代码,并没有看到任何修改源字符串的内容,但直到现在我才能真正逐步完成它。果然……它并没有取代任何东西!我开始觉得自己是个糟糕的 Stack Exchanger,因为这是我第三次回答自己的问题。我没有意识到 toString 在 UNIX 系统上返回一个没有 \r 的字符串,而且碰巧我使用的每个其他模块(FTP、SQL、电子邮件)要么自动添加它,要么不需要它。所以我没想过直接检查源字符串,因为它适用于所有其他格式。
  • 我是否理解正确,您在调试器中查看了字符串,结果让您感到困惑?
猜你喜欢
  • 1970-01-01
  • 2013-02-13
  • 2017-10-10
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 2016-07-11
  • 2015-01-28
  • 1970-01-01
相关资源
最近更新 更多