3

SFTP によるファイル転送用のシェル スクリプトは既に作成されており、AIX バージョン 6.1 で正常に動作します。私は SAP Data Services を使用して ETL を開発しており、シェル スクリプトは初めてです。単体テスト中に、ターゲット フォルダー名がユーザーによって変更された場合をシミュレートするために、SFTP に存在しないターゲット フォルダーを指定しましたが、コマンドcdの後で失敗せず、終了コード 0 が返されましたが、エラー メッセージはエコーされました:正規化できませんでした: 失敗。これにより、ETL プロセスはファイルが転送されなかったことを認識しなくなります。スクリプトに exit 1 を挿入すると、ETL ジョブが SFTP の失敗をキャッチし、それ自体が失敗しました。これは予期された動作です。

私の質問は、SFTP コマンドを呼び出してコード 1 で終了する既存のシェル スクリプトを微調整するにはどうすればよいですか?

スクリプトからの抜粋は次のとおりです。

'#!/bin/sh

....

echo cd $TARGET_REMOTE_DIR>>$INPUT_FILE

echo put $TARGET_LOCAL_DIR$TARGET_FILE_NAME>>$INPUT_FILE

echo quit>>$INPUT_FILE

/usr/bin/sftp -b $INPUT_FILE $USER@$HOSTNAME

echo $?command の直後に変数をcd追加すると、リモート dir のスペルが間違っていると 0 が返されます。私が考えているのは、おそらくコマンドの後にエラーメッセージが存在するかどうかをインラインでチェックし、cdその長さが0でない場合はコード1で終了することです.

疑似コードのようなもの:

error_msg = get_error_msg({cd $TARGET_REMOTE_DIR>>$INPUT_FILE})

if length(trim(error_msg)) <> 0 then
echo “Cannot change directory! Aborting…”

exit 1

fi

コメントをお待ちしております。

乾杯!

Martin の多大な助けを借りて、このソリューションを実装しました。コマンド /usr/bin/sftp の直後にコードを返し、キャッチされたエラーで強制的に終了します!

/usr/bin/sftp -b $INPUT_FILE $USER@$HOSTNAME

if [[ $? -ne 0 ]]; then
  " SFTP Error while accessing remote target directory! Error message"
  exit $?
fi 

皆さん、ありがとうございました!素晴らしいフォーラム!

4

1 に答える 1

1

まず、 OpenSSH を使用していると思いますsftp

コマンドが失敗すると、OpenSSHsftpは実際にスクリプトを中止し、で終了します。1cd

したがって、問題はおそらく SFTP スクリプトではなく、終了コードをキャプチャする方法にあります。

終了コードを取得する方法の詳細を共有すると、より具体的な回答が得られる場合があります。

あなたのテストに関してはecho $?
どこにecho $?コマンドを入れますか?SFTP スクリプト ( $INPUT_FILE) に送信しますか? コマンドsftpがありません。echoまた、解決することもできません$?

次のようにシェルスクリプトに入れると:

echo cd $TARGET_REMOTE_DIR>>$INPUT_FILE
echo $?

それはあなたが望むことをしません。ここでは、前のコマンドの結果を照会しているだけでecho、失敗する可能性はほとんどありません。

于 2013-05-27T07:05:10.043 に答える