Проблема со сценарием FTP-сессии заключается в том, что FTP считает, что он выполнил себя правильно, если сообщает об ошибках в стандартный вывод.Следовательно, ошибки чертовски трудно улавливать, так как это только вернет ошибку на что-то катастрофическое.Если вам нужно что-то большее, чем самый простой из списков команд, вы действительно должны использовать что-то вроде ожидаемого или Java или Perl-программу, которая может легко проверить результат каждого действия.
Тем не менее, вы может запустить ftp как сопроцесс или настроить его так, чтобы он работал в фоновом режиме с его stdin и stdout, подключенными к именованным каналам, или какой-то подобной структурой, где вы можете прочитать и проанализировать вывод одной команды, прежде чем решить, чтопередать следующий.
Цикл чтения, который циклически повторяет оператор case, который проверяет известные ответы и ведет себя соответствующим образом, является приемлемо приемлемой версией для всех команд.если вы всегда завершаете каждый командный блок чем-то вроде image
команды, которая возвращает фиксированное и известное значение, вы можете сканировать на наличие известных ошибок и проверять возвращение этой команды в операторе case, и когда вы получаете «sentinal»msgstr "вернуть цикл назад и прочитать следующий ввод.Тем не менее, это приводит к длинному и довольно сложному сценарию оболочки.
Кроме того, вам нужно проверить, что когда вы получаете (например) возвращаемое 5[0-9][0-9] *)
, это на самом деле не "553 байта *", потому что ftpЭто так же винит вас.
Извиняюсь за длину ответа, не включая пример кода - я просто хотел упомянуть некоторые идеи и предостережения, которые не будут вписываться в комментарий.