54

ソースファイル名にコロン()文字を含むscpinを使用してファイルをコピーしようとしています。私が使用しているコマンドの難読化されたバージョンは次のとおりです。bash:

scp file\:\ name.mp4 user@host:"/path/to/dest"

このエラーが発生します:

ssh: Could not resolve hostname Portal 2: Name or service not known

ファイルの名前を変更して削除できることはわかっています:が、コロンをエスケープできるかどうかを知りたいのですが。

4

2 に答える 2

101

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が使用されている場所:

  1. nullコマンド:、エスケープする必要はありませんが、コマンドに影響を与えないのと同じよう\e\c\h\o fooに、エスケープする必要はありません(「効果なし」は完全に真ではありません。1つ以上の文字をエスケープすると、エイリアスの一致が妨げられますエイリアス:
  2. PATH(およびその他CDPATH、、 )値をエスケープしても有用な効果はありません(少し予期しないことですが、をMAILPATH含むディレクトリからPATHでプログラムを実行できませんでした):
  3. パラメータ展開${name:-x}などは、であるname必要があります[a-zA-Z_][a-zA-Z0-9_]。したがって、変数名をエスケープする必要はありません。また、あいまいさがないため:、パラメータ展開の他のバリエーションで後続にエスケープする必要もありません。
  4. ? :trinaryは変数と数値のみを操作し、エスケープする必要はありません
  5. ===~のようなパターンのクラスを使用すると、[[:digit:]]で逃げることができますが、それ\:がどのように役立つかについて私は途方に暮れています...
  6. コマンド名または関数名内では、エスケープする必要\:はなく、有用な効果はありません

(nullコマンドは単なる:、「」のような名前のコマンドまたは関数を持つことが:fooでき、エスケープせずに呼び出すことができます。この点で#、名前の付いたコマンド#fooをエスケープする必要がある場所とは異なります。)

于 2013-02-05T23:16:26.910 に答える
1

@ mr.spuraticの回答として完全修飾パスを使用しようとしましたが、機能しません。私の状況では、絶対パスを使用する必要があります。これが私の解決策です。

scp `hostname`:/root/this/is/test/file.txt user@host:"/path/to/dest"
于 2019-02-21T10:08:28.797 に答える