ローカルディレクトリとリモートディレクトリパスを入力し、ファイルをリモートディレクトリに送信する子shファイルがあります。リモートパスが無効な場合、エラーを検出できません。
shスクリプト内のコンテンツの例:
sftp [email protected] <<==
cd $remote_dir <= error happens here
lcd $local_dir <= error did not happen so the return code resets
put a.tar
bye
==
$result=$?
return $result
一部のアプリケーションはshファイルを呼び出し、戻りコードを使用してファイルが正常に転送されたことを確認します。その場合は、ローカルファイルをどこかにバックアップしてから削除してください。
問題は、ファイル転送に失敗してもシェルがゼロを返すことです。ファイルは実際にはコピーされません。コマンドを手動で実行するとエラーが発生し、画面にパスが見つからないと表示されますが、ジョブとして実行すると失敗することがわかります。
別の方法は、2段階のプロセスを実行することです。まず、パスが存在することを確認してからログファイルに出力し、ログにエラーがあるかどうかを確認し、エラーがない場合はsftp putシェルスクリプトを呼び出すことができます。別の方法があるかどうか疑問に思います。
答え1
sftp
次のオプションを使用して実行してください-b
。
sftp -b - [email protected] <<==
cd etc.
==
~からsftp
手動:
-雨バッチ
モードでは、標準入力ではなく入力バッチファイルから一連のコマンドを読み込みます。ユーザーの対話が不足しているため、非対話型認証で使用する必要があります。バッチファイル「-」を使用して標準入力を表すことができます。sftpがハングします次のいずれかのコマンドが失敗した場合: get, put, reget, reput, rename, ln, rm, mkdir,目次、これ、目次、chmod、chown、chgrp、lpwd、df、シンボリックリンク、lmkdir。 "-"文字を先頭に追加することで、コマンドごとのエラー終了を抑制できます(例:-rm /tmp/blah*)。
答え2
SFTPでエラーを処理するのは痛いです。 SFTP スクリプト言語には条件付き構成はありません。事前定義されたコマンドシーケンス以外の操作を実行するには、各コマンドの後にサーバーの出力を解析する必要があります。などのツールを使用してこれを実行できますが、expect
かなりの作業が必要であり、すべての状況に対処していることを確認するのは困難です。
示した例では、次のものを使用できます。
echo "put $local_dir/a.tar $remote_dir" | sftp [email protected]
しかし、一般にエラー処理は複雑です。
したがって、SFTPを使用しないでください。代わりに、以下を使用してリモートサーバーをインストールします。SSHFS。 SSHFS は内部的に SFTP を使用するため、サーバーに特別な構成は必要ありません。あなたはただ持っていればいいヒューズ顧客のために働きなさい。
SSHFSは、ローカルコンピュータにマウントされたファイルシステムでリモートファイルビューを提供します。したがって、などの一般的なコマンドを使用して、各ファイルの場所を気にせずにファイルを操作できますcd
(cp
パフォーマンスの観点からは除外 - たとえば、ローカルの場所からリモートの場所にファイルをコピーすることはアップロード帯域幅よりも高速ではありません)。 。
set -e
mkdir myserver
sshfs [email protected]/ myserver
cp -p "$local_dir/a.tar" "myserver/$remote_dir/"
…
fusermount -u
答え3
ヒント/アドバイスに従う ザイルズの答え、stderrリダイレクトが私たちにとって効果的です。
sftp -q host <<--- > script.log 2> scripterr.log
get nonex.txt
bye
---
その後、scripterr.log
「見つかりません」を確認してください。