SFTP はエラーを除くすべてのメッセージを表示しません。

SFTP はエラーを除くすべてのメッセージを表示しません。

bashスクリプトでsftpだけを使用して、ローカルシステム上のファイルをFTPサーバーに「ドロップ」したいと思います。

エラーを除くすべてのメッセージを抑制したいです。

sftp $user@$server 2>&1 1>/dev/null <<EOF
put $local_file_path $remote_file_path
EOF

成功した場合のコマンド出力:

Connecting to <server>...

なぜまだ受け取ることができますか?

答え1

Connecting to <server>...それはおそらく、ファイル記述子2(stderr)に転送したからです。ファイル記述子1(stdout)と2(stderr)の唯一の違いは、前者が次のようになることです。伝統的に一般的なメッセージに使用され、後者は伝統的にデバッグやエラー出力に使用されます。ただし、プログラムはあるチャンネルまたは別のチャンネルに入る内容を決定するため、ある出力または別の出力をリダイレクトできますが、印刷する場所を決定することはできません。たとえば、エラーがstderrにのみ送信されるように強制することはできません。

答え2

実際に同じ問題があり、この解決策を思い出しました。 100%正常な出力ではありませんが、stderrエラーの原因を特定するのに役立ちます。

sftp $user@$server > /dev/null 2>&1 <<EOF
put $local_file_path $remote_file_path
EOF

sftp_status=$?
case $sftp_status in
    0) sftp_error="";;
    1) sftp_error="Error 1: Generic error - Undetermined error in file copy";;
    2) sftp_error="Error 2: Remote host connection failure";;
    3) sftp_error="Error 3: Destination is not directory, but it should be";;
    4) sftp_error="Error 4: Connecting to host failed";;
    5) sftp_error="Error 5: Connection lost for some reason";;
    6) sftp_error="Error 6: File does not exist";;
    7) sftp_error="Error 7: No permission to access file";;
    8) sftp_error="Error 8: Undetermined error from sshfilexfer";;
    9) sftp_error="Error 9: File transfer protocol mismatch";;
    65) sftp_error="Error 65: Host not allowed to connect";;
    66) sftp_error="Error 66: Protocol error";;
    67) sftp_error="Error 67: Key exchange failed";;
    68) sftp_error="Error 68: Host authentication failed";;
    69) sftp_error="Error 69: MAC error";;
    70) sftp_error="Error 70: Compression error (not used in SSH2)";;
    71) sftp_error="Error 71: Service not available";;
    72) sftp_error="Error 72: Protocol version not supported";;
    73) sftp_error="Error 73: Host key not verifiable";;
    74) sftp_error="Error 74: Connection lost";;
    75) sftp_error="Error 75: Disconnected by application";;
    76) sftp_error="Error 76: Too many connections";;
    77) sftp_error="Error 77: Cancelled by user";;
    78) sftp_error="Error 78: No more auth methods available";;
    79) sftp_error="Error 79: Illegal user name";;
    255) sftp_error="Error 255: Error occurred in SSH";;
    *) sftp_error="Unknown sftp Error";;
esac
echo $sftp_error

ステータスコードは次のリストに基づいています。https://support2.microfocus.com/techdocs/2487.html

あなたが受け取るステータスコードはSFTPクライアントによって異なります。
したがって、一部のクライアントはステータスコードのみを使用します。01&255

答え3

残念ながら、この質問に正しく答えた人は誰もいませんでした。

努力する:

sftp_command 2>&1 >/dev/null | grep -v 'Connecting to'

stderrをstdoutにリダイレクトし、それからstdoutを/ dev / nullにリダイレクトすると、接続を除くすべてを表示できます。

答え4

なぜまだ受け取ることができますか?

sftpこのメッセージはとして印刷され、あなたはローリダイレクト(ターミナルなど)をstderr使用しているためです。stderrstdout2>&1

ご存知のように、ファイル記述子などのものは&1リンク(または概念に精通している場合はポインタ)ではなく値です。したがって、 を入力すると2>&1実際に起こることは次のようになります。

  1. stdoutシェルは、ファイル記述子1()が現在指している場所を見つけます。あなたの場合、インタラクティブシェルでこれを実行しているので、stdout端末を指します。
  2. ファイル記述子2(stderr)も端末に設定されています。

したがって、後で最初のファイル記述子を変更する1>/dev/nullときstderrstderr頼る何らかの方法でstdout

すべてをリダイレクトするには、/dev/nullファイル記述子の値がどのように互いにコピーされるかを考慮する必要があります。これにより、リダイレクトが次のように並べ替えられます。

sftp $user@$server 1>/dev/null 2>&1

これでstdout値がに設定され、/dev/null現在stderrの値stdout、つまりに設定されます/dev/null。うん!

関連情報