ftp скрипт в bash - PullRequest
       8

ftp скрипт в bash

3 голосов
/ 10 января 2011

У меня есть следующий скрипт, который отправляет файлы в удаленное местоположение:

#!/usr/bin/bash
HOST1='a.b.c.d'
USER1='load'
PASSWD1='load'
DATE=`date +%Y%m%d%H%M`
DATE2=`date +%Y%m%d%H`
DATE3=`date +%Y%m%d`
FTPLOGFILE=/logs/Done.$DATE2.log
D_FOLDER='/dir/load01/input'

PUTFILE='file*un'
ls $PUTFILE | while read file
do
  echo "${file} transfered at $DATE" >> /logs/$DATE3.log
done

ftp -n -v $HOST1 <<SCRIPT >> ${FTPLOGFILE} 2>&1
quote USER $USER1
quote PASS $PASSWD1
cd $D_FOLDER
ascii
prompt off
mput /data/file*un 
quit
SCRIPT

mv *un test/

ls test/*un | awk '{print("mv "$1" "$1)}' | sed 's/\.un/\.processed/2' |sh
rm *unl

Я получаю эту ошибку:

200 PORT command successful.
553 /data/file1.un: A file or directory in the path name does not exist.
200 PORT command successful.

Ответы [ 3 ]

5 голосов
/ 10 января 2011

Некоторые улучшения:

#!/usr/bin/bash
HOST1='a.b.c.d'
USER1='load'
PASSWD1='load'
read Y m d H M <<<$(date "+%Y %m %d %H %M")    # only one call to date
DATE='$Y$m$d$H$M'
DATE2='$Y$m$d$H'
DATE3='$Y$m$d'
FTPLOGFILE=/logs/Done.$DATE2.log
D_FOLDER='/dir/load01/input'

PUTFILE='file*un'
for file in $PUTFILE    # no need for ls
do
  echo "${file} transfered at $DATE"
done >> /logs/$DATE3.log    # output can be done all at once at the end of the loop.

ftp -n -v $HOST1 <<SCRIPT >> ${FTPLOGFILE} 2>&1
quote USER $USER1
quote PASS $PASSWD1
cd $D_FOLDER
ascii
prompt off
mput /data/file*un 
quit
SCRIPT

mv *un test/

for f in test/*un    # no need for ls and awk
do
  mv "$f" "${f/%.un/.processed}"
done

rm *unl

Я рекомендую использовать строчные или смешанные переменные, чтобы уменьшить вероятность конфликтов имен с переменными оболочки.

Действительно ли все эти каталоги находятся прямо в корнекаталог

0 голосов
/ 23 мая 2018

Проблема со сценарием FTP-сессии заключается в том, что FTP считает, что он выполнил себя правильно, если сообщает об ошибках в стандартный вывод.Следовательно, ошибки чертовски трудно улавливать, так как это только вернет ошибку на что-то катастрофическое.Если вам нужно что-то большее, чем самый простой из списков команд, вы действительно должны использовать что-то вроде ожидаемого или Java или Perl-программу, которая может легко проверить результат каждого действия.

Тем не менее, вы может запустить ftp как сопроцесс или настроить его так, чтобы он работал в фоновом режиме с его stdin и stdout, подключенными к именованным каналам, или какой-то подобной структурой, где вы можете прочитать и проанализировать вывод одной команды, прежде чем решить, чтопередать следующий.

Цикл чтения, который циклически повторяет оператор case, который проверяет известные ответы и ведет себя соответствующим образом, является приемлемо приемлемой версией для всех команд.если вы всегда завершаете каждый командный блок чем-то вроде image команды, которая возвращает фиксированное и известное значение, вы можете сканировать на наличие известных ошибок и проверять возвращение этой команды в операторе case, и когда вы получаете «sentinal»msgstr "вернуть цикл назад и прочитать следующий ввод.Тем не менее, это приводит к длинному и довольно сложному сценарию оболочки.

Кроме того, вам нужно проверить, что когда вы получаете (например) возвращаемое 5[0-9][0-9] *), это на самом деле не "553 байта *", потому что ftpЭто так же винит вас.

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

0 голосов
/ 10 января 2011

Ftp на удаленный сайт и выполните команды ftp вручную.Когда происходит ошибка, посмотрите вокруг, чтобы увидеть причину.(Используйте «help», если вы не знаете командную строку ftp.)

Возможно, каталог /data не существует.кто-нибудь недавно реорганизовал каталог загрузки или, возможно, переместил корневой каталог ftp-сервера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...