В настоящее время я создаю ночную работу, которая вызывает сценарий Unix, который, в свою очередь, создает и передает файл с использованием ftp
. Я хотел бы проверить все возможные коды возврата. Страница руководства для ftp
не отображает коды возврата. Кто-нибудь знает, где найти список? Кто-нибудь с опытом? У нас есть другие скрипты, которые grep для определенных строк возврата в журнале, и они отправляют электронное письмо по ошибке. Однако они часто пропускают непредвиденные коды. Затем я помещаю причину в журнал и электронную почту.Проверка кода возврата ftp из сценария Unix
ответ
Команда ftp
не ничего, кроме нуля на большинстве реализаций, которые я пришел через вернуться.
Гораздо лучше обрабатывать трехзначные коды в журнале - и если вы отправляете двоичный файл, вы можете проверить, что отправленные байты были правильными.
трехзначных кодов называются «коды серии» и список можно найти here
Жаль, что я болею, но у меня есть 2 вопроса. 1) Но где же журнал? Я предположил, что это будет в $ ftpreturn. 2) Как проверить отправленные байты? – 2008-09-26 16:35:33
Почему бы просто не сохранить все выходные данные из команды в файл журнала, а затем проверить код возврата из команды и, если это не 0, отправить файл журнала в электронном письме?
хромой ответ я знаю, но как о получении источников передачи файлов и убедитесь сами
Как мне это сделать? – 2008-09-26 16:35:02
Я думаю, что проще запустить FTP и проверить код выхода из фтп, если что-то пошло не так.
Я сделал это, как на примере ниже:
# ...
ftp -i -n $HOST 2>&1 1> $FTPLOG << EOF
quote USER $USER
quote PASS $PASSWD
cd $RFOLDER
binary
put $FOLDER/$FILE.sql.Z $FILE.sql.Z
bye
EOF
# Check the ftp util exit code (0 is ok, every else means an error occurred!)
EXITFTP=$?
if test $EXITFTP -ne 0; then echo "$D ERROR FTP" >> $LOG; exit 3; fi
if (grep "^Not connected." $FTPLOG); then echo "$D ERROR FTP CONNECT" >> $LOG; fi
if (grep "No such file" $FTPLOG); then echo "$D ERROR FTP NO SUCH FILE" >> $LOG; fi
if (grep "access denied" $FTPLOG); then echo "$D ERROR FTP ACCESS DENIED" >> $LOG; fi
if (grep "^Please login" $FTPLOG); then echo "$D ERROR FTP LOGIN" >> $LOG; fi
Edit: Ловить ошибок я Grep вывод команды FTP. Но это действительно не лучшее решение.
Я не знаю, как вы знакомы с Scriptlanguage, как Perl, Python или Ruby. Все они имеют FTP-модуль, который вы можете использовать. Это позволяет вам проверять наличие ошибок после каждой команды. Вот пример, в Perl:
#!/usr/bin/perl -w
use Net::FTP;
$ftp = Net::FTP->new("example.net") or die "Cannot connect to example.net: [email protected]";
$ftp->login("username", "password") or die "Cannot login ", $ftp->message;
$ftp->cwd("/pub") or die "Cannot change working directory ", $ftp->message;
$ftp->binary;
$ftp->put("foo.bar") or die "Failed to upload ", $ftp->message;
$ftp->quit;
Вот что я, наконец, пошел. Спасибо за помощь. Все ответы помогают привести меня в правильном направлении. Это может быть немного перебор, проверяя как результат, так и журнал, но он должен охватывать все базы.
echo "open ftp_ip
pwd
binary
lcd /out
cd /in
mput datafile.csv
quit"|ftp -iv > ftpreturn.log
ftpresult=$?
bytesindatafile=`wc -c datafile.csv | cut -d " " -f 1`
bytestransferred=`grep -e '^[0-9]* bytes sent' ftpreturn.log | cut -d " " -f 1`
ftptransfercomplete=`grep -e '226 ' ftpreturn.log | cut -d " " -f 1`
echo "-- FTP result code: $ftpresult" >> ftpreturn.log
echo "-- bytes in datafile: $bytesindatafile bytes" >> ftpreturn.log
echo "-- bytes transferred: $bytestransferred bytes sent" >> ftpreturn.log
if [ "$ftpresult" != "0" ] || [ "$bytestransferred" != "$bytesindatafile" ] || ["$ftptransfercomplete" != "226" ]
then
echo "-- *abend* FTP Error occurred" >> ftpreturn.log
mailx -s 'FTP error' `cat email.lst` < ftpreturn.log
else
echo "-- file sent via ftp successfully" >> ftpreturn.log
fi
Вы сказали, что вы хотели FTP файл, но вы не сказали, был ли или не регулярно BSD FTP клиента единственным способом, которым Вы хотели, чтобы получить его там. BSD FTP не дает вам код возврата для условий ошибки, требующих всего этого синтаксического анализа, но существует целый ряд других программ Unix, которые могут использоваться для передачи файлов по FTP, если вы или ваш администратор установили их. Я приведу несколько примеров способов передачи файла по FTP, сохраняя при этом все условия ошибки с небольшим количеством кода.
FTPUSER ваш FTP имя пользователя Логин
FTPPASS ваш FTP пароль
FILE является локальный файл, который вы хотите загрузить без информации пути (например, file1.txt, не /whatever/file1.txt или что-то/file1.txt
FTPHost является удаленной машиной вы хотите FTP в
REMOTEDIR абсолютный путь к папке на удаленном компьютере, который вы хотите загрузить в
Вот примеры:
локон --user $ FTPUSER: $ FTPPASS -Т $ FILE FTP: // $ FTPHost /% 2f $ REMOTEDIR
FTP-загрузки --host $ FTPHost - пользователь $ FTPUSER --password $ FTPPASS --as $ REMOTEDIR/$ FILE $ FILE
tnftp -u FTP: // $ FTPUSER: $ FTPPASS @ $ FTPHost /% 2f $ REMOTEDIR/$ FILE $ FILE
wput $ FILE ftp: // $ FTPUSER: $ FTPPASS @ $ FTPHOST /% 2f $ REMOTEDIR/$ FILE
Все эти пр. ograms вернет ненулевой код выхода, если что-то вообще пойдет не так, как и текст, который указывает, что не удалось. Вы можете проверить это, а затем сделать все, что хотите, с выходом, зарегистрировать его, отправить по электронной почте и т. Д. По вашему желанию.
Пожалуйста, обратите внимание на следующее, однако:
«% 2f» используется в URL, чтобы указать, что следующий путь абсолютный путь на удаленной машине. Однако, если ваш FTP-сервер вас закручивает, вы не сможете обойти это.
для команд выше, которые используют фактический URL-адрес (ftp://etc) на сервере с встроенным в него пользователем и паролем, имя пользователя и пароль ДОЛЖНЫ быть закодированы в URL, если они содержат специальные символы.
В некоторых случаях вы можете быть гибкими, если удаленный каталог является абсолютным, а локальный файл - просто обычным именем файла, когда вы знакомы с синтаксисом каждой программы. Возможно, вам просто нужно добавить переменную окружения локального каталога или просто сделать все жесткое кодирование.
Если вы действительно, абсолютно ДОЛЖНЫ использовать обычный FTP-клиент, один из способов, которым вы можете протестировать отказ, внутри вашего скрипта, включая первую команду, которая запускает файл, а затем другую, которая выполняет GET того же файла возвращая его под другим именем. После выхода из FTP просто проверьте наличие загруженного файла в сценарии оболочки или даже проверите его против оригинала, чтобы убедиться, что он правильно передан. Да, это воняет, но, на мой взгляд, лучше иметь код, который легко читать, чем тонны синтаксического анализа для каждого возможного условия ошибки. BSD FTP не так уж и хорош.
Мне нравится решение от Анураг, для байтов переданы проблемы, я продлил команду с Grep -v "байт"
т.е.
Grep "^ 530" ftp_out2.txt | grep -v "byte"
- вместо 530 вы можете использовать все коды ошибок, как это сделал Anurag.
Я написал сценарий для передачи только одного файла за раз, и в этом скрипте используйте grep
, чтобы проверить сообщение 226 Transfer complete
. Если он находит его, grep
возвращает 0.
ftp -niv < "$2"_ftp.tmp | grep "^226 "
Спасибо, ребята, как вы, вероятно, может сказать, моя Unix сценариев не так далеко вперед. Я в основном работаю из других скриптов людьми, которые раньше работали здесь. Однако я хотел бы сделать его более пуленепробиваемым, чем то, что я нашел до сих пор. Я ценю все ответы до сих пор. – 2008-09-26 15:49:35
В основном мой код до сих пор выглядит следующим образом: echo «open $ ftpip pwd binary lcd/out cd/in mput $ datafile quit» | ftp -iv> $ ftpreturn Опция -v выглядит так, как мне нужно. Но переменная $ ftpreturn пуста. Файл не получает ftp'd и терпит неудачу. Что мне не хватает? – 2008-09-26 15:51:02