bashエスケープの問題ではありません。[user@]ホストプレフィックスとしてscp扱われます。次のことを試してください。x:
scp ./file:\ name.mp4 user@host:"/path/to/dest"
相対パス(例./)または完全修飾パス(/path/to/source)を使用すると、この動作が防止されます。/前に存在すると、OpenSSHは可能性のあるプレフィックス:のチェックを停止します)。host:user@host:
OpenSSHのscp唯一の特殊なケースのファイル名はコロンで始まり、問題なく機能します。通常の意味でのエスケープはサポートされておらず:、有効なホスト名の他の概念もありません。そのため、aを含むほとんどすべてのファイル名:がこれ(または同等のもの)を引き起こす可能性があります。[ ]以前に見つかった場合のIPv6の動作:)。
これは他のプログラムにも影響を与える可能性があります。たとえばrsync、同じ回避策がそこに適用されます。
(OpenSSHは[]囲まれたIPv6アドレスを単純に解析するため、で始まるファイル、またはの前に含まれるファイルと含まれないscpファイルを正常にファイルできますが、これは一般的には役に立ちません;-):[@[:]:
(以下のテキストは、元の質問が「bashでコロンをエスケープするにはどうすればよいですか?」というときに書かれたものです。これはその状況に当てはまりますがscp、シェルのエスケープの量が役に立たないためではありません。)
脱出方法についての質問に答える:必要はありませんが、「\:」は機能します。aが使用されている場所::
- nullコマンド
:、エスケープする必要はありませんが、コマンドに影響を与えないのと同じよう\e\c\h\o fooに、エスケープする必要はありません(「効果なし」は完全に真ではありません。1つ以上の文字をエスケープすると、エイリアスの一致が妨げられます。エイリアス:)
PATH(およびその他CDPATH、、 )値をエスケープしても有用な効果はありません(少し予期しないことですが、をMAILPATH含むディレクトリからPATHでプログラムを実行できませんでした):
- パラメータ展開
${name:-x}などは、であるname必要があります[a-zA-Z_][a-zA-Z0-9_]。したがって、変数名をエスケープする必要はありません。また、あいまいさがないため:、パラメータ展開の他のバリエーションで後続にエスケープする必要もありません。
? :trinaryは変数と数値のみを操作し、エスケープする必要はありません
===~のようなパターンのクラスを使用すると、[[:digit:]]で逃げることができますが、それ\:がどのように役立つかについて私は途方に暮れています...
- コマンド名または関数名内では、エスケープする必要
\:はなく、有用な効果はありません
(nullコマンドは単なる:、「」のような名前のコマンドまたは関数を持つことが:fooでき、エスケープせずに呼び出すことができます。この点で#、名前の付いたコマンド#fooをエスケープする必要がある場所とは異なります。)