Назад | Перейти на главную страницу

Обзор потребностей сценария SFTP

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

Когда файл создается, он создает файл .ready, который должен сигнализировать о том, что файл полностью создан и готов к sftp. например, файл с именем 10312014.13.07.40.27711113 также будет иметь завершающий файл 10312014.13.07.40.27711113.ready.

Я не знаю, как правильно проверить 10312014.13.07.40.27711113.ready и если он есть sftp 10312014.13.07.40.27711113.

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

Спасибо!

#!/bin/bash -x
source /opt/foobar/$1/config/usrconfig.sh

### foobar environment variables ###
export FTPHOST="sftpserv.foobar.com"                                    # server to ftp to
export FTPUSR="foouser"                                              # ftp user id
export FTPPASS="foo123"                                      # ftp user password
export PATTERN=                                      # pattern for file name to ftp
export USING_MARKER=no                                          # using a marker file???
#export TDEMARKER="X"                                    # pattern for marker file if no files to  ftp
export FTPDIR="/home/foo"  # directory to ftp to on ftp server
export DAEMONLOG=/home/foobaruser/TDEdeamon.log
export DAEMONSLEEP=10
export CURRDATE=`date +%d-%m-%Y-%H-%M`
export READDIR=/home/foobaruser/TDE
#export TEMP=/opt/foobar/$ENV/tmp
export TDE_BACKUP=/home/foobaruser/TDE/backup

cd $READDIR
if [ -a  $READDIR ]
   then
     echo " $CURRDATE files found to send in $READDIR!" >>$DAEMONLOG 2>&1
   else
     echo "no files found in $READDIR to send!" >>$DAEMONLOG 2>&1
     exit
fi
sleep 2

touch tde_batch
for i in *.ready
 do {
 FILE="${i%.ready}"
 [ -e "$FILE" ] || continue
  echo " Going to put ${FILE} in $FTPDIR directory" >>$DAEMONLOG 2>&1
  echo "put ${FILE}" >> tde_batch
  }
  echo "quit" >> tde_batch

  sftp -b tde_batch $FTPUSR@$FTPHOST 

  rm tde_batch  

        cp $i $TDE_BACKUP
            cd $TDE_BACKUP
            rm *.ready
done

Я запустил сценарий с -x, ниже - результат.

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

Моя логика явно неверна, хотелось бы получить некоторую правильную директиву!

Спасибо! Надеюсь, эта информация поможет лучше. Также я вижу ошибку отказано в разрешении, но я предполагаю, что пакету нужны общие ключи ssh, а не пароль, в производственном окружении ключи уже общие, и это не будет проблемой

+ FTPPASS=fooy123
+ export PATTERN=
+ PATTERN=
+ export USING_MARKER=no
+ USING_MARKER=no
+ export FTPDIR=/home/foouser
+ FTPDIR=/home/foouser
+ export DAEMONLOG=/home/foobaruser/TDEdeamon.log
+ DAEMONLOG=/home/foobaruser/TDEdeamon.log
+ export DAEMONSLEEP=10
+ DAEMONSLEEP=10
++ date +%d-%m-%Y-%H-%M
+ export CURRDATE=03-11-2014-10-07
+ CURRDATE=03-11-2014-10-07
+ export READDIR=/home/foobaruser/TDE
+ READDIR=/home/foobaruser/TDE
+ export TDE_BACKUP=/home/foobaruser/TDE/backup
+ TDE_BACKUP=/home/foobaruser/TDE/backup
+ cd /home/foobaruser/TDE
+ '[' -a /home/foobaruser/TDE ']'
+ echo ' 03-11-2014-10-07 files found to send in /home/foobaruser/TDE!'
+ sleep 2
+ touch tde_batch
+ for i in '*.ready'
+ FILE=10312014.10.36.51.52667612
+ '[' -e 10312014.10.36.51.52667612 ']'
+ echo ' Going to put 10312014.10.36.51.52667612 in /home/foouser directory'
+ echo 'put 10312014.10.36.51.52667612'
+ echo quit
+ sftp -b tde_batch foouser@foobar01.foobar.com
Permission denied (gssapi-keyex,gssapi-with-mic,publickey,password,keyboard-interactive).
Couldn't read packet: Connection reset by peer
+ cp 10312014.10.36.51.52667612.ready /home/foobaruser/TDE/backup
+ cd /home/foobaruser/TDE/backup
+ rm 10312014.10.36.51.52667612.ready
+ for i in '*.ready'
+ FILE=10312014.11.15.41.64934033
+ '[' -e 10312014.11.15.41.64934033 ']'
+ continue
+ for i in '*.ready'
+ FILE=10312014.11.22.53.52444830
+ '[' -e 10312014.11.22.53.52444830 ']'
+ continue
+ for i in '*.ready'
+ FILE=10312014.12.34.26.49837220
+ '[' -e 10312014.12.34.26.49837220 ']'
+ continue
+ for i in '*.ready'
+ FILE=10312014.12.36.16.5815654
+ '[' -e 10312014.12.36.16.5815654 ']'
+ continue
+ for i in '*.ready'
+ FILE=10312014.12.47.03.24215656
+ '[' -e 10312014.12.47.03.24215656 ']'
+ continue
+ for i in '*.ready'
+ FILE=10312014.12.49.21.40757399
+ '[' -e 10312014.12.49.21.40757399 ']'
+ continue
+ for i in '*.ready'
+ FILE=10312014.13.01.41.84187558
+ '[' -e 10312014.13.01.41.84187558 ']'
+ continue
+ for i in '*.ready'
+ FILE=10312014.13.07.18.23453400
+ '[' -e 10312014.13.07.18.23453400 ']'
+ continue
+ for i in '*.ready'
+ FILE=10312014.13.07.40.27711113
+ '[' -e 10312014.13.07.40.27711113 ']'
+ continue
+ for i in '*.ready'
+ FILE=10312014.13.26.27.08714191
+ '[' -e 10312014.13.26.27.08714191 ']'
+ continue



[foobaruser@foobar02 TDE]$ cat tde_batch
put 10312014.10.36.51.52667612
quit

Чтобы проверить файлы, вы можете сделать следующее.

find $FILE_PATH -type f -name '*.ready' | while read file
do
  real_file="${file%.ready}"
  echo "put $real_file" >> tde_batch
done
echo 'quit' >> tde_batch
echo sftp -b tde_batch "$FTPUSR@$FTPHOST"
rm tde_batch

Вы можете использовать lftp для подключения к sftp на каком-либо сервере; и вместо паролей вы можете использовать те же ключи ssh, которые вы используете для ssh, если хотите. Чтобы автоматизировать операции через ftp, вы можете написать сценарий и предоставить его lftp. Например, вы можете проверить Вот