-1

以下のスクリプトは、sftpを介してファイルをリモートの場所にプッシュすることです。コードの下に書き込むために多くの問題に直面しましたが、それでもいくつかの問題に直面しています。問題を解決するために私に教えてください。shでは機能しません。kshでのみ機能します。 。

#test script 
#-------------------------------------------------------------------
#!/bin/sh
#------------------------------------------------------------------------
# sftp_file_uploads.sh 
#------------------------------------------------------------------------
export REMOTE_SERVER_PROD='192.168.0.1'
export REMOTE_SERVER_FAILOVER='192.168.0.2'
export SFTP_PORT='0001'
export SOURCE_FUNCTIONAL_ID='testusr'
export SOURCE_FILE_DIRECTORY='/var/temp/files/'
export SOURCE_ARCHIVE_DIRECTORY='/var/temp/files/archive'
export DATE_FORMAT=`date "+%Y%m%d"`
export LOG_DIRECTORY='/var/temp/logs'
export DESTINATION_FILE_DIRECTORY='/dest'
export LOG_FILE='$LOG_DIRECTORY/test_$DATE_FORMAT.log'
export SFTP_BATCH_FILE='/var/tmp/SFTP_BATCH_FILE'
#------------------------------------------------------------------------
# Find if the files are available at the source directory.
#------------------------------------------------------------------------
cd $SOURCE_FILE_DIRECTORY 
export FILE_TO_UPLOAD_TESTD=`ls -lrt TESTD$DATE_FORMAT.csv  | awk '/TESTD/{ f=$NF };END{ print f }'`
export FILE_TO_UPLOAD_TESTDF=`ls -lrt TESTDF$DATE_FORMAT.csv  | awk '/TESTDF/{ f=$NF };END{ print f }'`
#------------------------------------------------------------------------
# Try 2 times and Sleep for 5 mins if either of the files is not present
#------------------------------------------------------------------------
counter=0
flag_file_found_TESTD=0
flag_file_found_TESTDF=0
while [ $counter –lt 2 ]
do
#---------------------------
# Check TESTD file arrived
#---------------------------
if [ -z $FILE_TO_UPLOAD_TESTD ] then
      echo “No TESTD file to transfer. Sleeping for 5 mins” >> $LOG_FILE
 sleep 300
else
 echo “TESTD file found to transfer.” >> $LOG_FILE
 flag_file_found_TESTD=1
fi
#---------------------------
# Check TESTDF file arrived
#---------------------------
if [ -z $FILE_TO_UPLOAD_TESTDF ] then
      echo “No TESTDF file to transfer. Sleeping for 5 mins” >> $LOG_FILE
 sleep 300
else
 echo “TESTDF file found to transfer.” >> $LOG_FILE
flag_file_found_TESTDF =1
fi
if [[ flag_file_found_TESTD == 1 &&
      flag_file_found_TESTDF == 1 ]] then
 echo “Both files are found.” >> $LOG_FILE
 break
else

 echo “At least one of the files is not found. Retrying now.” >> $LOG_FILE
fi
counter=`expr $counter + 1`
done
if [[ flag_file_found_TESTD == 1 &&
      flag_file_found_TESTDF == 1 ]] then
 echo “Both files are found.”
 break
else
 if [ flag_file_found_TESTD == 0 ] then
    echo “test file is not found and two attempts completed. Cannot transfer the file for today.” >> $LOG_FILE
 fi

if [flag_file_found_TESTDF == 0 ] then
 echo “test1 file is not found and two attempts completed. Cannot transfer the file for today.” >> $LOG_FILE
 fi
fi
#------------------------------------------------------------------------
# Create sftp script
#------------------------------------------------------------------------
rm -f $SFTP_BATCH_FILE
echo "lcd $SOURCE_FILE_DIRECTORY " > $SFTP_BATCH_FILE
echo "cd $DESTINATION_FILE_DIRECTORY " >> $SFTP_BATCH_FILE
if [ -z $FILE_TO_UPLOAD_TESTD ] then
echo "put $FILE_TO_UPLOAD_TESTD " >> $SFTP_BATCH_FILE
fi
if [ -z $FILE_TO_UPLOAD_TESTDF ] then
echo "put $FILE_TO_UPLOAD_TESTDF " >> $SFTP_BATCH_FILE
fi
echo "bye" >> $SFTP_BATCH_FILE

#------------------------------------------------------------------------
# Do sftp
#------------------------------------------------------------------------
echo " Before SFTP " >> $LOG_FILE
if [[ -z $ FILE_TO_UPLOAD && -z $ FILE_TO_UPLOAD1 ]] then
 echo “No files to transfer” >> $LOG_FILE
       mv $LOG_FILE $LOG_DIRECTORY
 exit 1
else 
echo “Attempting to connect to  Remote Server $REMOTE_SERVER_PROD” >> $LOG_FILE
/usr/bin/sftp –v -oPort=$SFTP_PORT -b $SFTP_BATCH_FILE $SOURCE_FUNCTIONAL_ID@$REMOTE_SERVER_PROD >> $LOG_FILE 2 >> $LOG_FILE
fi
result=$?
errorConnectToProd=0
if [ $result -eq 0 ]
then
  echo "SFTP completed successfully to Prod Remote Server" >> $LOG_FILE
else
    errorConnectToProd=1
   if [[ $result -eq 4 || $result -eq 5 ]]
  echo "FAILED to connect to Server. " >> $LOG_FILE

   else
 echo "FAILED to SFTP to  Remote Server. " >> $LOG_FILE
   fi
fi
if [ errorConnectToProd == 1 ] then
echo “Attempting to connect to FAILOVER Remote Server $REMOTE_SERVER_FAILOVER” >> $LOG_FILE
/usr/bin/sftp –v -oPort=$SFTP_PORT -b $SFTP_BATCH_FILE $SOURCE_FUNCTIONAL_ID@$REMOTE_SERVER_FAILOVER >> $LOG_FILE 2 >> $LOG_FILE
fi
result=$?
if [ $result -eq 0 ]
then
  echo "SFTP completed successfully to Failover Remote Server" >> $LOG_FILE
else
   echo "FAILED to SFTP to Failover Remote Server. " >> $LOG_FILE
   mv $LOG_FILE $LOG_DIRECTORY
   exit 1
   fi
fi
cd $SOURCE_FILE_DIRECTORY
mv $FILE_TO_UPLOAD_TESTD $SOURCE_ARCHIVE_DIRECTORY
echo “Moved $FILE_TO_UPLOAD_TESTD to archive direcotry.” >> $LOG_FILE
mv $FILE_TO_UPLOAD_TESTDF $SOURCE_ARCHIVE_DIRECTORY
echo “Moved $FILE_TO_UPLOAD_TESTDF to archive direcotry.” >> $LOG_FILE

rm -f $SFTP_BATCH_FILE
echo “Deleted the SFTP Batch file.” >> $LOG_FILE
echo “Upload completed.” >> $LOG_FILE
mv $LOG_FILE $LOG_DIRECTORY
exit 0

エラーを下回る:

test.ksh[41]: $LOG_DIRECTORY/test_$DATE_FORMAT.log: cannot create

test.ksh[55]: $LOG_DIRECTORY/test_$DATE_FORMAT.log: cannot create

test.ksh[56]: flag_file_found_TESTDF:  not found

test.ksh[65]: $LOG_DIRECTORY/test_$DATE_FORMAT.log: cannot create

test.ksh[41]: $LOG_DIRECTORY/test_$DATE_FORMAT.log: cannot create

test.ksh[55]: $LOG_DIRECTORY/test_$DATE_FORMAT.log: cannot create

test.ksh[56]: flag_file_found_TESTNDF:  not found

test.ksh[65]: $LOG_DIRECTORY/test_$DATE_FORMAT.log: cannot create

test.ksh[79]: [flag_file_found_TESTDF:  not found

rm: /var/tmp/SFTP_BATCH_FILE is a directory

test.ksh[89]: /var/tmp/SFTP_BATCH_FILE: cannot create

test.ksh[90]: /var/tmp/SFTP_BATCH_FILE: cannot create

test.ksh[97]: B:  not found

test.ksh[98]: B:  not found

test.ksh[99]: B:  not found

test.ksh[100]: B:  not found

test.ksh[101]: B:  not found

test.ksh[102]: B:  not found

test.ksh[106]: /var/tmp/SFTP_BATCH_FILE: cannot create

test.ksh[113]: $LOG_DIRECTORY/test_$DATE_FORMAT.log: cannot create

test.ksh[114]: syntax error at line 114 : `FILE_TO_UPLOAD' unexpected

よろしく、

チャイ

4

1 に答える 1

4

この行は間違っています:

export LOG_FILE='$LOG_DIRECTORY/test_$DATE_FORMAT.log'

変数が展開されるように、二重引用符を使用する必要があります。

export LOG_FILE="$LOG_DIRECTORY/test_$DATE_FORMAT.log"

別のエラー:

if [flag_file_found_TESTDF == 0 ] then

の後にスペースが必要[です。[はコマンド(の同義語ですtest)であり、すべてのコマンドはスペースで引数から区切られています。

/ var / tmp / SFTP_BATCH_FILEがすでに存在し、ディレクトリであるため、「Createsftpscript」というラベルの付いたセクション全体が失敗しています。rm -fディレクトリは削除されません。を使用する必要がありますrm -rf

if [[ flag_file_found_TESTD == 1 &&
  flag_file_found_TESTDF == 1 ]] then

$変数名の前にがありません。

if [[ -z $ FILE_TO_UPLOAD && -z $ FILE_TO_UPLOAD1 ]] then

後のスペースを削除し$ます。

更新2:

すべてのステートメントで、の前に(または改行)ifがありません。;then

すべての「B:見つかりません」エラーの原因がわかりません。しかし、他のすべてのエラーを修正すると、おそらくそれはなくなるか、見つけやすくなります。

于 2012-10-26T22:38:02.283 に答える