2017-02-08 3 views
1

При создании нового скрипта автоматизации ruby ​​для обработки файлов вверх и вниз из sftp-соединения у меня возникают проблемы с извлечением имен файлов. Используя те же самые точные методы, я создал автоматические скрипты sftp, которые активно используются и не имеют особых проблем, но я не могу показать доступные имена файлов в этой настройке sftp.Сломанные имена файлов с Ruby при подключении к SFTP версии 5

Я знаю, что соединение sftp прекрасное, так как я могу загружать файлы и могу жестко указывать путь/имя файла для загрузки файлов. Моя проблема, похоже, связана с чтением имен файлов.

Используя типичные методы, я могу только показаться, чтобы получить вывод о том, что, как представляется, объектный файл или масса запутанного текста, который действительно включает имена файлов:

"#<Net::SFTP::Protocol::V04::Name:0x4f6d598 @name=nil, @attributes=#<Net::SFTP::Protocol::V04::Attributes:0x4f6d5c8 @attributes={:type=>1}>>" 

или (клип от массы перемешаны (восьмеричное?) данные, которые содержат имена файлов делает):

"#<Net::SFTP::Protocol::V04::Name:[email protected]="[email protected]\000\000\000\027domain [email protected]\000\000\001\200\000\000\000\000X\201\031)\000\000\000\000XE\252\312\000\000\000\000X\201\031)\000\000\000\b\000\000\000\031MVP20170106-238682954.999\000\000\002\275\001\000\000\000\000\000\000\001K\000\000\000\[email protected]\000\000\000\027domain [email protected]\000\000\001\200\000\000\000\000X~z\366\000\000\000\000X~z\366\000\000\000\000Xo\373=\000\000\000\000\000\000\000'MVP20170106-238682954.HTML\000\000\002\275\001\000...." 

Этот выход из кода (упрощенный):

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 и без него

+0

Что вы получаете, если печатаете 'file.name'? –

+0

Использование print file.name Я получаю смещенный вывод, но похоже, что он пытался присвоить символы восьмеричному коду: 'inistrators @ BUILTIN ↨domain users @ POSTNTRACK ☺Ç Xü ↓) XE¬╩ Xü ↓) ↓ 20170106-2682954.999 ☻╜☺ ☺K ▬Администраторы @ BUILTIN ↨областные пользователи @ POSTNTRACK ☺Ç X ~ ​​z ÷ X ~ z ÷ Xo√ = 'M20170106-2382954_SUMMARY_5010.HTML ☻╜☺ 0/▬Администраторы @ BUILTIN ↨областные пользователи @ POSTNTRACK ☺Ç X ~ ​​z≈ X ~ z≈ Xo√> ↓ MVP270111-238912517.999 ☻╜☺ ☺Q ▬Администраторы @ BUILTIN ↨областные пользователи @ POSTNTRACK ☺Ç X ~ ​​z ÷ X ~ z ÷ Xvôt'20170111-238912517_SUMMARY_50.HTML ' –

+0

Что вы получаете, когда вы подключиться с помощью автономного клиента SFTP, например WinSCP? - Покажите нам свой журнал. –

ответ

1

Сервер реализует SFTP версию 5. Это довольно необычно. Большинство SFTP-серверов (в частности, OpenSSH) поддерживают только версию 3. По этой причине более новые версии протокола редко используются, и не редкость, что их реализация ошибочна (как не проверена надлежащим образом). Что, по-видимому, имеет место здесь. Реализация Ruby версии SFTP версии 5, вероятно, неверна.

Вы можете заставить нижнюю версию протокола использовать HIGHEST_PROTOCOL_VERSION_SUPPORTED=3 в sftp/session.rb. Не похоже, что есть способ изменить версию для каждого сеанса. Хотя, маловероятно, что изменение нарушит ваши другие сеансы, так как они, скорее всего, будут использовать версию 3 в любом случае.

+0

Отлично, это меня смутило. Я буду проверять свои другие сценарии, которые используют sftp/session.rb, чтобы убедиться, но я уверен в вашей разбивке. Еще раз спасибо! –

Смежные вопросы