SFTP 脚本需求概述

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 [email protected]
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

答案1

要检查文件,您可以执行以下操作。

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。例如,您可以检查这里

相关内容