ディレクトリ内のすべてのファイルをリモートサーバーにアップロードして削除するBASHシェルスクリプトを作成しています。 CRONジョブを介して数時間ごとに実行されます。
私の完全なスクリプトは以下のとおりです。基本的な問題は、ファイルが正常にアップロードされたかどうかを判断することになっている部分が機能しないことです。 SFTPコマンドの終了ステータスは、アップロードが実際に成功したかどうかに関係なく、常に「0」です。
ファイルが正しくアップロードされたかどうかを確認して、ファイルを削除するかどうかを確認するにはどうすればよいですか?
#!/bin/bash
# First, save the folder path containing the files.
FILES=/home/bob/theses/*
# Initialize a blank variable to hold messages.
MESSAGES=""
ERRORS=""
# These are for notifications of file totals.
COUNT=0
ERRORCOUNT=0
# Loop through the files.
for f in $FILES
do
# Get the base filename
BASE=`basename $f`
# Build the SFTP command. Note space in folder name.
CMD='cd "Destination Folder"\n'
CMD="${CMD}put ${f}\nquit\n"
# Execute it.
echo -e $CMD | sftp -oIdentityFile /home/bob/.ssh/id_rsa [email protected]
# On success, make a note, then delete the local copy of the file.
if [ $? == "0" ]; then
MESSAGES="${MESSAGES}\tNew file: ${BASE}\n"
(( COUNT=$COUNT+1 ))
# Next line commented out for ease of testing
#rm $f
fi
# On failure, add an error message.
if [ $? != "0" ]; then
ERRORS="${ERRORS}\tFailed to upload file ${BASE}\n"
(( ERRORCOUNT=$ERRORCOUNT+1 ))
fi
done
SUBJECT="New Theses"
BODY="There were ${COUNT} files and ${ERRORCOUNT} errors in the latest batch.\n\n"
if [ "$MESSAGES" != "" ]; then
BODY="${BODY}New files:\n\n${MESSAGES}\n\n"
fi
if [ "$ERRORS" != "" ]; then
BODY="${BODY}Problem files:\n\n${ERRORS}"
fi
# Send a notification.
echo -e $BODY | mail -s $SUBJECT [email protected]
頭を痛める運用上の考慮事項のため、SCPは使用できません。リモートサーバーはWindowsでWinSSHDを使用しており、EXEC権限がないため、SCPコマンドはすべて失敗し、「チャネル0でExecリクエストが失敗しました」というメッセージが表示されます。したがって、アップロードはインタラクティブなSFTPコマンドを使用して行う必要があります。
SFTPセッションをバッチ処理する場合、終了ステータス$?
は、転送が失敗したかどうかを通知します。
echo "put testfile1.txt" > batchfile.txt
sftp -b batchfile.txt user@Host
if [[ $? != 0 ]]; then
echo "Transfer failed!"
exit 1
else
echo "Transfer complete."
fi
追加のために編集:これは私たちが職場の制作スクリプトで使用するものなので、有効だと思います。一部のお客様はSCO Unixを使用しているため、scpを使用できません。
前提条件に過度に疑問を投げかけないのはserverfaultの伝統ですが、私は尋ねる必要があります。1)SMB経由でリモートファイルシステムをマウントするか、2)代わりにFuse/sshfsを使用することはできませんか? (ここでは、bashとsshを使用しているため、送信マシンはLinuxボックスであると想定しています。)
実際にあなたの質問に答えるために、あなたの問題は単純だと思います。考慮してください:
quest@wonky:~$ false
quest@wonky:~$ if [ $? != "0" ] ; then echo asdf ; fi
asdf
quest@wonky:~$ if [ $? != "0" ] ; then echo asdf ; fi
代わりに次のように試してください:
quest@wonky:~$ false
quest@wonky:~$ res=$?
quest@wonky:~$ if [ $res != "0" ] ; then echo asdf ; fi
asdf
quest@wonky:~$ if [ $res != "0" ] ; then echo asdf ; fi
asdf
説明:2番目のifステートメント "if [$?!=" 0 "]; then"は、最新のステートメント(sftpではなく、以前のifステートメント)の終了ステータスをテストします。
次に、ファイルのアップロードに問題がある場合、sftpは本当にゼロ以外で終了しますか? Cursoryテストは私のものではないことを示しています。
**実際にバッチファイルを使用するように編集され、バッチベースのソリューションを拡張します。
実行中のsftpのコピーで、エラーポイントを超えて複数のコマンドが存在していても、バッチファイルがエラーで終了します
最初にポストされたロジックにより、$?をチェックすることにより、バッチ全体の結果をテストしています。正常に送信されたファイルの一部を削除しても問題がない場合は、各putの後に!rmを使用してバッチファイルをビルドします。プットが失敗した場合、!rmは実行されません
(for F in *.pgp
do
echo put $F
echo !rm $F
done;echo quit) > Batchfile ; sftp -b Batchfile user@targetServer
rsync(.exe)
とDig in --remove-source-files
&co。を使用してください。失敗したアップロードについても気にしないでください。 ;-)
はい、これをsshと結び付けることができます。--rsh
を参照してください
ジャーヘッド
windows OSでsftp Batchスクリプトを実行して成功/失敗を検出するのはどうですか?
%errorlevel%を使用して成功/失敗を検出しますが、%errorlevel%が0で返されることがありますが、そのセッションは失敗し、ファイルはサーバーにアップロードされません。私のスクリプトは以下です
アップロードされたsftpを正しく検出するにはどうすればよいですか? THXそんなに
@echo off
(echo cd %4
echo put %2
echo exit)>sftpScript.txt
sftp -b sftpScript.txt %3
set result=%errorlevel%
if result EQU 0 (
del sftpScript.txt
del %2
) else (
del sftpScript.txt
)
exit %result%