SCPを使用してAWSのリモートLinuxホストからファイルをプルするスクリプトがあります。問題なく約6か月間同じコードを毎晩実行した後、今日は_protocol error: filename does not match request
_で失敗し始めました。以下のより簡単なファイル名で問題を再現しました:
_$ scp -i $IDENT $Host_AND_DIR/"foobar" .
# the file is copied successfully
$ scp -i $IDENT $Host_AND_DIR/"'foobar'" .
protocol error: filename does not match request
# used to work, i swear...
$ scp -i $IDENT $Host_AND_DIR/"'foobarbaz'" .
scp: /home/user_redacted/foobarbaz: No such file or directory
# less surprising...
_
一重引用符を使用した理由は、元々名前にスペースが含まれているファイルを取得していたためです。スペースを扱うために、私は何ヶ月も_$Host_AND_DIR/"'foo bar'"
_を行いましたが、今日から、それは_$Host_AND_DIR/"foo\ bar"
_のみを受け入れます。だから、私の問題is修正済みですが、私はまだ何が起こっているのか知りたいです。
エラーメッセージをGoogleで検索しましたが、実際の説明が表示されないので、驚いています。
関係する両方のホストの_OpenSSL 1.0.2g
_の出力には_ssh -v localhost
_があり、_bash --version
_はGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
と言っていますか?
私は最終的にソースコードを調べて、このエラーがスローされるコミットを見つけました:
remote-> localディレクトリのコピーは、ユーザーが指定したワイルドカードを満たします。
このチェックにより、悪意のあるサーバーが予期しないファイル名を送信するのをある程度防ぐことができますが、クライアントとサーバーのワイルドカード拡張ルールの違いにより、必要なファイルが拒否されるリスクがあります。
このため、これにより、チェックを無効にする新しい-Tフラグも追加されます。
彼らは新しいフラグを追加しました-T
これは、彼らが追加したこの新しいチェックを無視するため、下位互換性があります。ただし、使用しているファイル名に制限付きのフラグが付けられている理由を調べて調べる必要があると思います。