2008-09-26 7 views
3

В настоящее время я создаю ночную работу, которая вызывает сценарий Unix, который, в свою очередь, создает и передает файл с использованием ftp. Я хотел бы проверить все возможные коды возврата. Страница руководства для ftp не отображает коды возврата. Кто-нибудь знает, где найти список? Кто-нибудь с опытом? У нас есть другие скрипты, которые grep для определенных строк возврата в журнале, и они отправляют электронное письмо по ошибке. Однако они часто пропускают непредвиденные коды. Затем я помещаю причину в журнал и электронную почту.Проверка кода возврата ftp из сценария Unix

+0

Спасибо, ребята, как вы, вероятно, может сказать, моя Unix сценариев не так далеко вперед. Я в основном работаю из других скриптов людьми, которые раньше работали здесь. Однако я хотел бы сделать его более пуленепробиваемым, чем то, что я нашел до сих пор. Я ценю все ответы до сих пор. – 2008-09-26 15:49:35

+0

В основном мой код до сих пор выглядит следующим образом: 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

ответ

7

Команда ftp не ничего, кроме нуля на большинстве реализаций, которые я пришел через вернуться.

Гораздо лучше обрабатывать трехзначные коды в журнале - и если вы отправляете двоичный файл, вы можете проверить, что отправленные байты были правильными.

трехзначных кодов называются «коды серии» и список можно найти here

+0

Жаль, что я болею, но у меня есть 2 вопроса. 1) Но где же журнал? Я предположил, что это будет в $ ftpreturn. 2) Как проверить отправленные байты? – 2008-09-26 16:35:33

-1

Почему бы просто не сохранить все выходные данные из команды в файл журнала, а затем проверить код возврата из команды и, если это не 0, отправить файл журнала в электронном письме?

1

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

+0

Как мне это сделать? – 2008-09-26 16:35:02

2

Я думаю, что проще запустить 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; 
4

ncftp Установите пакет. Он поставляется с ncftpget и ncftpput, каждый из которых будет загружать/загружать один файл и возвращаться с описательным кодом ошибки, если есть проблема. См. Раздел «Диагностика» в файле man page.

0

Вот что я, наконец, пошел. Спасибо за помощь. Все ответы помогают привести меня в правильном направлении. Это может быть немного перебор, проверяя как результат, так и журнал, но он должен охватывать все базы.

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 
0

Вы сказали, что вы хотели 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 вернет ненулевой код выхода, если что-то вообще пойдет не так, как и текст, который указывает, что не удалось. Вы можете проверить это, а затем сделать все, что хотите, с выходом, зарегистрировать его, отправить по электронной почте и т. Д. По вашему желанию.

Пожалуйста, обратите внимание на следующее, однако:

  1. «% 2f» используется в URL, чтобы указать, что следующий путь абсолютный путь на удаленной машине. Однако, если ваш FTP-сервер вас закручивает, вы не сможете обойти это.

  2. для команд выше, которые используют фактический URL-адрес (ftp://etc) на сервере с встроенным в него пользователем и паролем, имя пользователя и пароль ДОЛЖНЫ быть закодированы в URL, если они содержат специальные символы.

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

  4. Если вы действительно, абсолютно ДОЛЖНЫ использовать обычный FTP-клиент, один из способов, которым вы можете протестировать отказ, внутри вашего скрипта, включая первую команду, которая запускает файл, а затем другую, которая выполняет GET того же файла возвращая его под другим именем. После выхода из FTP просто проверьте наличие загруженного файла в сценарии оболочки или даже проверите его против оригинала, чтобы убедиться, что он правильно передан. Да, это воняет, но, на мой взгляд, лучше иметь код, который легко читать, чем тонны синтаксического анализа для каждого возможного условия ошибки. BSD FTP не так уж и хорош.

1

Мне нравится решение от Анураг, для байтов переданы проблемы, я продлил команду с Grep -v "байт"

т.е.

Grep "^ 530" ftp_out2.txt | grep -v "byte"

- вместо 530 вы можете использовать все коды ошибок, как это сделал Anurag.

5

Я написал сценарий для передачи только одного файла за раз, и в этом скрипте используйте grep, чтобы проверить сообщение 226 Transfer complete. Если он находит его, grep возвращает 0.

ftp -niv < "$2"_ftp.tmp | grep "^226 "