Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Я думаю, что проще запустить ftp и проверить код выхода 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

Редактировать: Чтобы обнаружить ошибки, я просматриваю выходные данные команды ftp.Но это действительно не лучшее решение.

Я не знаю, насколько вы знакомы с такими языками сценариев, как 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: $@";
$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;

Чтобы эта логика работала, пользователю необходимо также перенаправить STDERR из команды ftp, как показано ниже.

ftp -i -n $HOST >$FTPLOG 2>&1 << EOF

Команда ниже всегда будет присваивать 0 (успех), поскольку команда ftp не возвращает успех или неудачу.Поэтому пользователь не должен зависеть от этого.

EXITFTP=$?

отстойный ответ, я знаю, но как насчет того, чтобы получить исходники FTP и убедиться в этом самостоятельно?

Мне нравится решение от Anurag, для проблемы с передачей байтов я расширил команду с помощью grep -v "bytes"

т.е.

grep "^530" ftp_out2.txt | grep -v "байт"

-вместо 530 можно использовать все коды ошибок как это сделал Анураг.

Вы сказали, что хотите отправить файл туда по FTP, но не сказали, является ли обычный FTP-клиент BSD единственным способом получить его туда.BSD FTP не дает вам кода возврата для ошибок, требующих всего этого анализа, но существует целый ряд других программ Unix, которые можно использовать для передачи файлов по FTP, если вы или ваш администратор их установите.Я приведу вам несколько примеров способов передачи файла по FTP, при этом выявляя все ошибки с помощью небольшого количества кода.

FTPUSER — ваше имя пользователя FTP.

FTPPASS — ваш пароль ftp

ФАЙЛ — это локальный файл, который вы хотите загрузить, без какой-либо информации о пути (например, file1.txt, а не /whatever/file1.txt или что-то еще/file1.txt).

FTPHOST — это удаленный компьютер, к которому вы хотите подключиться по FTP.

REMOTEDIR — это АБСОЛЮТНЫЙ ПУТЬ к месту на удаленном компьютере, куда вы хотите загрузить файлы.

Вот примеры:

Curl --user $FTPUSER:$FTPPASS -T $FILE ftp://$FTPHOST/%2f$REMOTEDIR

ftp-upload --host $FTPHOST --user $FTPUSER --пароль $FTPPASS --as $REMOTEDIR/$FILE $FILE

tnftp -u ftp://$FTPUSER:$FTPPASS@$FTPHOST/%2f$REMOTEDIR/$FILE $FILE

wput $FILE ftp://$FTPUSER:$FTPPASS@$FTPHOST/%2f$REMOTEDIR/$FILE

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

Однако обратите внимание на следующее:

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

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

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

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

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

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, отправить файл журнала по электронной почте?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top