web-dev-qa-db-ja.com

スクリプト化されたコマンドラインSFTPセッションでアップロードの成功/失敗を検出しますか?

ディレクトリ内のすべてのファイルをリモートサーバーにアップロードして削除する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コマンドを使用して行う必要があります。

7
Will Martin

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を使用できません。

8
UtahJarhead

前提条件に過度に疑問を投げかけないのは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テストは私のものではないことを示しています。

1
Bittrance

**実際にバッチファイルを使用するように編集され、バッチベースのソリューションを拡張します。
実行中のsftpのコピーで、エラーポイントを超えて複数のコマンドが存在していても、バッチファイルがエラーで終了します

最初にポストされたロジックにより、$?をチェックすることにより、バッチ全体の結果をテストしています。正常に送信されたファイルの一部を削除しても問題がない場合は、各putの後に!rmを使用してバッチファイルをビルドします。プットが失敗した場合、!rmは実行されません

(for F in *.pgp
do
echo put $F
echo !rm $F
done;echo quit) > Batchfile ; sftp -b Batchfile user@targetServer
0
Tom

rsync(.exe)とDig in --remove-source-files&co。を使用してください。失敗したアップロードについても気にしないでください。 ;-)

はい、これをsshと結び付けることができます。--rshを参照してください

0
Tabakhase

ジャーヘッド

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%
0
pkpk