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クライアントによって異なります。
したがって、一部のクライアントはステータスコードのみを使用します。0、1&255
答え3
残念ながら、この質問に正しく答えた人は誰もいませんでした。
努力する:
sftp_command 2>&1 >/dev/null | grep -v 'Connecting to'
stderrをstdoutにリダイレクトし、それからstdoutを/ dev / nullにリダイレクトすると、接続を除くすべてを表示できます。
答え4
なぜまだ受け取ることができますか?
sftp
このメッセージはとして印刷され、あなたはローリダイレクト(ターミナルなど)をstderr
使用しているためです。stderr
stdout
2>&1
ご存知のように、ファイル記述子などのものは&1
リンク(または概念に精通している場合はポインタ)ではなく値です。したがって、 を入力すると2>&1
実際に起こることは次のようになります。
stdout
シェルは、ファイル記述子1()が現在指している場所を見つけます。あなたの場合、インタラクティブシェルでこれを実行しているので、stdout
端末を指します。- ファイル記述子2(
stderr
)も端末に設定されています。
したがって、後で最初のファイル記述子を変更する1>/dev/null
ときstderr
(stderr
頼る何らかの方法でstdout
。
すべてをリダイレクトするには、/dev/null
ファイル記述子の値がどのように互いにコピーされるかを考慮する必要があります。これにより、リダイレクトが次のように並べ替えられます。
sftp $user@$server 1>/dev/null 2>&1
これでstdout
値がに設定され、/dev/null
現在stderr
の値stdout
、つまりに設定されます/dev/null
。うん!