Ответы FTP-сервера иногда не обнаруживаются в пакетном режиме

Я запускаю командный файл в Win2003 для передачи файла через FTP.

Пакетный файл направляет результаты FTP-сеанса в FIND, чтобы увидеть, есть ли сообщение об успешном завершении 226, и это хорошо работает. К сожалению, из планировщика я попал в состояние уровня ошибки, хотя файл успешно передается и возвращается сообщение 226.

FTP -s:go.ftp 2>NUL | Find "226 Transfer OK" > NUL
If ErrorLevel 1 Echo ERROR - FTP transfer failed. >> err.log

Учетная запись пользователя является учетной записью администратора, поэтому это не проблема с правами. Любые идеи?

ОБНОВЛЕНИЕ:

Сообщение 226 не перехватывается с помощью перенаправления, что приводит к ошибке FIND. В моем тестировании я перенаправлял вывод FTP в отдельный файл при запуске из планировщика. Хотя команды FTP выполняются успешно, ни один из ответов сервера не появляется.

Вот мой FTP-скрипт:

open ftpsite
username
password
dir
quit

Вот результат (FTP -s:go.ftp >ftp.log 2>ftp.err).

User (ftpsite:(none)): open ftpsite
04-01-12  02:35PM       <DIR>          DIR1

04-01-12  02:35PM       <DIR>          DIR2

04-01-12  02:35PM       <DIR>          DIR3

04-01-12  02:35PM       <DIR>          DIR4



dir 
quit

Кроме того, в потоке ошибок ничего не отображается (2> ftp.err). По крайней мере, теперь я знаю, почему мой уровень ошибок FIND не запускается, но почему не записываются ответы FTP-сервера? Я не использую переключатель -v и не включаю подробный.


person Tony    schedule 30.03.2012    source источник
comment
Как насчет -d включить отладку? Возможно, вам придется проанализировать ftp.log каким-либо другим способом, чтобы определить, было ли оно успешным или нет.   -  person tomlogic    schedule 11.04.2012
comment
-D не дает ответов сервера. Это похоже на то, что планировщик создает для оболочки альтернативную реальность, в которой он не может захватить все.   -  person Tony    schedule 16.04.2012


Ответы (2)


Включает ли путь планировщика каталоги FTP и FIND?

Можете ли вы сохранить вывод FTP во временный файл и передать его FIND для тестирования? Таким образом, вы сможете проверить вывод FTP постфактум, чтобы увидеть, что могло произойти.

Как насчет того, чтобы исключить перенаправления (или направить вывод в файл журнала ошибок), чтобы вы могли просмотреть вывод пакетного файла на предмет возможных сообщений об ошибках?

person tomlogic    schedule 30.03.2012
comment
Да, командный файл успешно работает из планировщика. Я также отправил весь вывод в файлы журнала, и результаты идентичны как для запуска планировщика, так и для запуска из командной строки. Пути в порядке, иначе запуск планировщика будет бомбой, и файла там не будет. У меня такая же проблема с обработкой результатов FTP в виде журнала через FIND. - person Tony; 31.03.2012
comment
Похоже, вы говорите, что FIND устанавливает другой ErrorLevel (код выхода) в зависимости от того, запускается ли он в интерактивном режиме или через планировщик. Точно ли это резюмирует проблему? - person tomlogic; 01.04.2012
comment
Похоже, что это так, хотя в интерактивном режиме не удается вывести нужное слово, поскольку я не ввожу НАЙТИ в командной строке. Скорее, я запускаю командный файл, содержащий команду НАЙТИ. - person Tony; 02.04.2012
comment
Мне нужно уточнить один из моих предыдущих комментариев. При дальнейшем тестировании, когда я перенаправляю вывод FTP в файл журнала, на самом деле отсутствуют ответы сервера, но перечислены сами результаты команд FTP. Например, команда DIR выводит список содержимого файла, но ответа 226 нет. Я обновлю основной вопрос выводом из FTP. - person Tony; 10.04.2012

Я наткнулся на это исследование, исследуя единственный отсутствующий код 226 в серии успешных в остальном переводов. Моя команда ftp вызывается из vbscript, но в остальном похожа на вашу:

ftp -i -n -s:"\path\to\cmdfile.txt" [ftpserver] > "\path\to\stdout.log" 2> "\path\to\stderr.log"

Из-за переключателя -n и анонимного входа мой командный файл немного отличается:

USER anonymous
cd [UploadDirectory]
binary
put [file]
quit

Как вы заметили, поток STDERR всегда кажется пустым, даже если соединение не удалось. За все время тестирования я ни разу не видел, чтобы STDERR содержал какую-либо информацию. Однако STDOUT содержит полный журнал транзакций:

220 Unauthorized access to this server is prohibited. All actions are logged.
USER anonymous
230-Anonmyous Access
230 Login successful.
cd [UploadDirectory]
250 Directory successfully changed.
binary
200 Switching to Binary mode.
put "[file]"
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
1058.3090.82quit
221 Goodbye.

Вместо того, чтобы передавать команду НАЙТИ, как в вашем примере, я анализирую файл STDOUT, и в 99% случаев совпадение выполняется на «226 Передача завершена»; В 1% случаев я вижу только

150 Ok to send data
quit

В случаях, когда 226 отсутствует, файл успешно передается (??) и остается нетронутым. Все это говорит о том, что, хотя это и не так элегантно, как конвейерная передача вывода в FIND, анализ файла STDOUT должен дать желаемые результаты.

Я могу вспомнить еще несколько вещей:

  1. Большинство проблем с планировщиком / cron вызвано путями и разрешениями. Планировщик MS включает параметр «Начать в (папка)» - пробовали ли вы установить его в каталог командного файла? Кроме того, учетной записи пользователя, для которой вы запускаете запланированное задание, вероятно, должны быть предоставлены явные (не унаследованные) разрешения на все файлы и папки, используемые пакетом. Если пакет постоянно работает из командной строки, но дает сбой в планировщике, проблема с разрешениями может быть больше, чем просто добавление учетной записи пользователя планировщика в группу администраторов.
  2. Что показывают журналы ftp вашего сервера? Мой ftp-сервер - vsftpd (Linux), и мои журналы сервера по существу имитируют поток STDOUT, захваченный перенаправлением (с некоторой дополнительной информацией). Это может сказать вам, передаются ли коды успешной передачи с вашего ftp-сервера.
  3. Вероятно, не причина, но рассмотрите возможность использования переключателя / I с FIND, чтобы сделать его нечувствительным к регистру.
  4. Вы пробовали возиться с командой перенаправления? Что-то вроде: ftp ... 2> & 1 | найти ...
person rhp997    schedule 09.05.2012
comment
В моем случае FTP-передача работает. Это больше похоже на то, что планировщик создает среду оболочки, в которой STDOUT недоступен. Как вы отметили, изначально я перенаправлял результаты в команду FIND, но в моем обновлении выше я также перенаправлял в файл. Как видите, команды FTP выполняются успешно, но связанные с ними коды результатов почему-то отсутствуют. - person Tony; 23.05.2012