2

我想我理解常规 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 标准的一部分时,为什么会发生这种情况?

4

2 回答 2

2

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

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

所以我想这里的教训是 toString 可能返回一个适合平台的行结束格式,即使 FTP 服务器托管在 Linux 上,ASCII 模式下的 org.apache.commons.net.ftp.FTPClient 也会在 \n 之前添加 \r (或者该服务器可能伪装成 Windows),并且电子邮件和 SQL 并不特别关心它们有哪些行尾。

于 2010-10-28T16:58:49.793 回答
1

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

于 2010-10-28T06:26:05.153 回答