连接到 SFTP 版本 5 时文件名损坏 Ruby
Broken filenames with Ruby when connected to SFTP version 5
在构建新的 ruby 自动化脚本来处理来自 sftp 连接的文件时,我在提取文件名时遇到了问题。
使用这些完全相同的方法,我构建了自动 sftp 脚本,这些脚本正在积极使用并且没有遇到太多麻烦,但我似乎无法在此 sftp 设置中输出文件的可用文件名。
我知道 sftp 连接很好,因为我可以上传文件并且可以在 path/filename 中进行硬编码以下载文件。
我的问题似乎专门与读取文件名有关。
使用典型的方法,我似乎只能得到看似文件对象的输出或大量包含文件名的混乱文本:
"#<Net::SFTP::Protocol::V04::Name:0x4f6d598 @name=nil, @attributes=#<Net::SFTP::Protocol::V04::Attributes:0x4f6d5c8 @attributes={:type=>1}>>"
或(从大量包含文件名的混乱(八进制?)数据中剪辑):
"#<Net::SFTP::Protocol::V04::Name:0x4f6d778@name="inistrators@BUILTIN[=12=]0[=12=]0[=12=]07domain users@POSTNTRACK[=12=]0[=12=]0[=12=]10[=12=]0[=12=]0[=12=]0[=12=]0X11)[=12=]0[=12=]0[=12=]0[=12=]0XE22[=12=]0[=12=]0[=12=]0[=12=]0X11)[=12=]0[=12=]0[=12=]0\b[=12=]0[=12=]0[=12=]01MVP20170106-238682954.999[=12=]0[=12=]0[=12=]25[=12=]1[=12=]0[=12=]0[=12=]0[=12=]0[=12=]0[=12=]0[=12=]1K[=12=]0[=12=]0[=12=]06Administrators@BUILTIN[=12=]0[=12=]0[=12=]07domain users@POSTNTRACK[=12=]0[=12=]0[=12=]10[=12=]0[=12=]0[=12=]0[=12=]0X~z6[=12=]0[=12=]0[=12=]0[=12=]0X~z6[=12=]0[=12=]0[=12=]0[=12=]0Xo3=[=12=]0[=12=]0[=12=]0[=12=]0[=12=]0[=12=]0[=12=]0'MVP20170106-238682954.HTML[=12=]0[=12=]0[=12=]25[=12=]1[=12=]0...."
此输出来自代码(简化):
require 'net/sftp'
require 'net/ssh'
Net::SSH.start(@site,@user,:password =>@pass) do |session|
session.sftp.connect do |sftp|
sftp.dir.foreach('/Download') do |file|
next if (file.name == '..' || file.name == '.')
next if !file.file?
p file
这应该很简单,但我已经研究这个问题好几个星期了; 请帮助提供信息,指出我哪里出错了,或者这可能是 SFTP 方面的问题? 尝试过包含和不包含 SSH 会话
服务器执行 SFTP 版本 5。这很不寻常。大多数 SFTP 服务器(尤其是 OpenSSH)仅支持版本 3。出于这个原因,新版本的协议很少被使用,并且它们的实现存在错误(因为未经过适当测试)的情况并不少见。这里似乎是这样。 Ruby SFTP 版本 5 的实现可能是错误的。
您可以在 sftp/session.rb
中使用 HIGHEST_PROTOCOL_VERSION_SUPPORTED=3
强制使用较低版本的协议。似乎没有办法在 per-session 的基础上更改版本。不过,更改不太可能破坏您的其他会话,因为他们很可能无论如何都使用版本 3。
Net::SFTP 2.1.3rc1 及更高版本(包括 2020 年发布的 3.0.0)支持将 SFTP 版本作为选项传递给 Net::SFTP#start
:
ssh_opts = { password: @pass }
sftp_opts = { version: 3 }
Net::SFTP.start(@site, @user, ssh_opts, sftp_opts) do |sftp|
sftp.dir.foreach('/Download') do |file|
# ...
end
end
在构建新的 ruby 自动化脚本来处理来自 sftp 连接的文件时,我在提取文件名时遇到了问题。 使用这些完全相同的方法,我构建了自动 sftp 脚本,这些脚本正在积极使用并且没有遇到太多麻烦,但我似乎无法在此 sftp 设置中输出文件的可用文件名。
我知道 sftp 连接很好,因为我可以上传文件并且可以在 path/filename 中进行硬编码以下载文件。 我的问题似乎专门与读取文件名有关。
使用典型的方法,我似乎只能得到看似文件对象的输出或大量包含文件名的混乱文本:
"#<Net::SFTP::Protocol::V04::Name:0x4f6d598 @name=nil, @attributes=#<Net::SFTP::Protocol::V04::Attributes:0x4f6d5c8 @attributes={:type=>1}>>"
或(从大量包含文件名的混乱(八进制?)数据中剪辑):
"#<Net::SFTP::Protocol::V04::Name:0x4f6d778@name="inistrators@BUILTIN[=12=]0[=12=]0[=12=]07domain users@POSTNTRACK[=12=]0[=12=]0[=12=]10[=12=]0[=12=]0[=12=]0[=12=]0X11)[=12=]0[=12=]0[=12=]0[=12=]0XE22[=12=]0[=12=]0[=12=]0[=12=]0X11)[=12=]0[=12=]0[=12=]0\b[=12=]0[=12=]0[=12=]01MVP20170106-238682954.999[=12=]0[=12=]0[=12=]25[=12=]1[=12=]0[=12=]0[=12=]0[=12=]0[=12=]0[=12=]0[=12=]1K[=12=]0[=12=]0[=12=]06Administrators@BUILTIN[=12=]0[=12=]0[=12=]07domain users@POSTNTRACK[=12=]0[=12=]0[=12=]10[=12=]0[=12=]0[=12=]0[=12=]0X~z6[=12=]0[=12=]0[=12=]0[=12=]0X~z6[=12=]0[=12=]0[=12=]0[=12=]0Xo3=[=12=]0[=12=]0[=12=]0[=12=]0[=12=]0[=12=]0[=12=]0'MVP20170106-238682954.HTML[=12=]0[=12=]0[=12=]25[=12=]1[=12=]0...."
此输出来自代码(简化):
require 'net/sftp'
require 'net/ssh'
Net::SSH.start(@site,@user,:password =>@pass) do |session|
session.sftp.connect do |sftp|
sftp.dir.foreach('/Download') do |file|
next if (file.name == '..' || file.name == '.')
next if !file.file?
p file
这应该很简单,但我已经研究这个问题好几个星期了; 请帮助提供信息,指出我哪里出错了,或者这可能是 SFTP 方面的问题? 尝试过包含和不包含 SSH 会话
服务器执行 SFTP 版本 5。这很不寻常。大多数 SFTP 服务器(尤其是 OpenSSH)仅支持版本 3。出于这个原因,新版本的协议很少被使用,并且它们的实现存在错误(因为未经过适当测试)的情况并不少见。这里似乎是这样。 Ruby SFTP 版本 5 的实现可能是错误的。
您可以在 sftp/session.rb
中使用 HIGHEST_PROTOCOL_VERSION_SUPPORTED=3
强制使用较低版本的协议。似乎没有办法在 per-session 的基础上更改版本。不过,更改不太可能破坏您的其他会话,因为他们很可能无论如何都使用版本 3。
Net::SFTP 2.1.3rc1 及更高版本(包括 2020 年发布的 3.0.0)支持将 SFTP 版本作为选项传递给 Net::SFTP#start
:
ssh_opts = { password: @pass }
sftp_opts = { version: 3 }
Net::SFTP.start(@site, @user, ssh_opts, sftp_opts) do |sftp|
sftp.dir.foreach('/Download') do |file|
# ...
end
end