ファイルをコピーしようとしたときにscpエラーが発生しました。

ファイルをコピーしようとしたときにscpエラーが発生しました。

私はscpAndroidデバイスからMacBookにファイルを頻繁に転送しますが、これは本当に魅力的です。しかし、John's folder私のMacBookにはフォルダというフォルダがあるので、そのディレクトリにファイルをコピーしようとすると、次のようになります。 scp [email protected]:/Users/macbook/desktop/John\'s\ folder/file storage/folder

エラーが返されます

unexpected EOF error while looking for matching \`’\`

そして

unexpected end of file

この問題をどのように解決できますか?

答え1

〜のようにOpenSSH バージョン 9.02022-04-08に公開されたこのscpプログラムは、SFTPプロトコルを直接使用します。したがって、元の質問はもう存在しないため、この回答の残りの部分はもう必要ありません。

以前のバージョンのSCPを使用しているscp場合、または以前のSCPプロトコルに戻したい場合は、scp -O答えはまだ適用されます。

元の答えは以下にあります。


興味深いです。私が見た他の答えは、エスケープされた引用符とエスケープされたスペースを引用符で囲まれた文字列に置き換えるように指示します。実際は同じなので、変更は表示されません(a\'\ bシェルと同じ"a' b")。

scpここで問題はリモートシステム与えられたコマンドラインを解釈します。

たとえば、次のように動作します。

scp John\'s\ folder/file localhost:/tmp/dst

しかし、これは失敗します。

scp localhost:/tmp/src/John\'s\ folder/file /tmp/dst

localhost(例として使用したので、user@host状況に合わせて使用​​してください。)

-v言葉が多い) フラグを使用すると、scp障害の原因を正確に確認できます。

debug1: Sending command: scp -v -f /tmp/src/John's folder/file
bash: -c: line 0: unexpected EOF while looking for matching `''
bash: -c: line 1: syntax error: unexpected end of file

ここで不幸な解決策は、特殊文字(スペースを含む)を2回(ローカルシェルで1回、リモートシェルで1回)エスケープする必要があることです。

scp localhost:"/tmp/src/John\'s\ folder/file" /tmp/dst

答え2

SCPでは、パラメータ全体を引用符で囲む必要があります。私の前にある2つの異なる答えは部分的に正しい答えですが、正しい答えは

scp "[email protected]:/Users/macbook/desktop/John's folder/file" storage/folder

最初の引数は引用符で囲まれていますが、2番目の引数はそうではありません。注釈が示すように、両方の引数が引用符で囲まれている場合、/ bin / scpはそれを単一の引数として呼び出し、その後に別のパラメータが必要です。

scp "[email protected]:/Users/macbook/desktop/John's folder/file storage/folder"単一引数として読み込まれます。空白があっても二重引用符を使用すると、スペースを避けることができます。

最後に、パラメータの中間に引用符を付けると、パラメータが半分になり、user@host:/ path / to / directoryは完全なパラメータであるため、シェルには意味がありません。そのうちのいくつかを使用できますが、半分に切り取ることはできません。それ以外の場合は、2つの異なるパラメータとして扱われます。scp [email protected]:"/Users/macbook/desktop/John's folder/file" storage/folder

答え3

トリプルエスケープは私にとって効果的でした。

scp [email protected]:bob\\\'s\\\ file /local/path/

これらも動作します:

scp "[email protected]:bob\'s\ file" /local/path/
scp [email protected]:"bob\'s\ file" /local/path/

これらは以下ではありません:

scp "[email protected]:bob's file" /local/path/
scp [email protected]:bob\'s\ file /local/path/

関連情報