sftp が stdout からログを隠すのはなぜですか?

sftp が stdout からログを隠すのはなぜですか?

a.sh次のようなコマンドを持つスクリプトがありますsftp:

echo "Starting to sftp..."
sftp [email protected] << END_SCRIPT
ls
mput *.csv.gz
bye

END_SCRIPT
echo "Sftp successfully."

対話形式で実行すると、 からのログ出力がsftp表示されます。ただし、 を crontab に設定し、 を使用して stdout をファイルにリダイレクトすると>、2 つのステートメントからの出力のみが表示されますecho。 コマンドからログを取得するにはどうすればよいでしょうかsftp

編集:

以下のフォームも試しましたが、機能しませんでした。

sftp -b バッチファイル.txt[メールアドレス]( cron からリダイレクト )

sftp -b バッチファイル.txt[メールアドレス]>> some_file.log ( cron からのリダイレクト + この行からのリダイレクト )

この問題は、マニュアル ページに記載されているように、対話的に実行されるはずの sftp の性質に関連していると思います。しかし、解決策が見つかりません。

私の配布:Red Hat Enterprise Linux AS release 3 (Taroon Update 2)

crontabエントリ:

52 14 * * * sh /home/xxx/testing/xxx.sh > /home/xxx/testing/xxx_`date +\%Y\%m\%d`.log

そして、crontab エントリと一致する時刻でログが作成されます。

SSHバージョン:

OpenSSH_3.6.1p2, SSH protocols 1.5/2.0, OpenSSL 0x0090701f

編集:

スクリプト ファイル内の sftp の出力をテキスト ファイルにリダイレクトすると、sftp からのメッセージがログに記録されることがわかりました。次に、ログ ファイルを削除し、cron でスケジュールしました。cron の実行後、ログ ファイルが生成されますが、sftp からのメッセージはありません。代わりに、スクリプト ファイル内の他のステートメントからのログのみが含まれます。

スクリプト ファイルで sftp の出力をリダイレクトして対話的に実行すると、ログはまったく問題ありません。ただし、cron でスケジュールすると (crontab エントリにリダイレクトはなく、単にスケジュールするだけ)、sftp からのログも消えてしまいます。

答え1

見たところ、出力リダイレクト発生していますが、 も含める必要があるでしょうstderr。crontab でこれを試してください:

52 14 * * * sh /home/xxx/testing/xxx.sh > /home/xxx/testing/xxx_`date +\%Y\%m\%d`.log 2>&1

2>&1最後に に注意してください。これは、「ファイル記述子 2stderrをファイル記述子 1 にリダイレクトする」という意味です。すでにファイルにstdoutリダイレクトしているため、もそこにリダイレクトされます。stdoutstderr

関連情報