scp(セキュアコピー)ファイル名の空白の問題

scp(セキュアコピー)ファイル名の空白の問題

セキュアコピー(scp)を使用してファイルをコピーしようとしています。次のコマンドを実行しようとしていますが、ディレクトリの場所の絶対パスにスペースがあるため、エラーが発生します。

scp -r -P 8484 [email protected]:/media/New Volume/lj /home/pratheep

次のエラーが発生します。

scp: /media/New: No such file or directory  
scp: Volume/lj: No such file or directory

次のコマンドを使用してバックスラッシュを追加してみました。

scp -r -P 8484 [email protected]:/media/New\ Volume/lj /home/pratheep

しかし、まだ同じエラーが発生します。

誰かがそれを修正する方法を教えてもらえますか?

答え1

ファイル名を2回引用する必要があります。一度はローカルシェル、一度はリモートシェルです。最も簡単な場合は、次のいずれかを実行できます。

scp -r -P 8484 [email protected]:"'/media/New Volume/lj'" /home/pratheep
scp -r -P 8484 [email protected]:'"/media/New Volume/lj"' /home/pratheep

またはタブ補完機能の使用に役立ちます

scp -r -P 8484 [email protected]:/media/New\\\ Volume/lj /home/pratheep

答え2

scprsyncリモートファイル名をリモートシェルに渡します。これにより、次のようなパターンを渡すことができます。

scp remotehost:'*.txt' .

ただし、リモートファイル名を提供するときに追加の引用符が必要な不快な結果があります。

-sこのオプションを渡すと、rsyncリモートシェルでファイル名が拡張されないように保護できます。しかし、これはrsyncの組み込みのワイルドカード拡張を有効にするので、まだ\[?*

解決策はアーカイブを転送することです。

ssh -P 8484 [email protected] 'cd "/media/New Volume" && tar cf - lj' |
tar xf - -C /home/pratheep

別のアプローチは、リモートファイルシステムをマウントし、通常のツールを使用してコピーを実行することです。

mkdir mnt
sshfs -p 8484 [email protected]:/ mnt
cp -Rp 'mnt/media/New Volume/lj' /home/pratheep
fusermount -u mnt
rmdir mnt

答え3

Bashスクリプトを使用してスペースを含むリモートパスからファイルをコピーしようとしたときにscp同様の問題が発生しました。

私が思いついた解決策は次のとおりです。

手動出口パス:

scp user@host:'dir\ with\ spaces/file\ with\ spaces' <destination>
scp user@host:"dir\\ with\\ spaces/file\\ with\\ spaces" <destination>
scp user@host:dir\\\ with\\\ spaces/file\\\ with\\\ spaces <destination>

注:オプションは必須ではありません-T(下記参照)。

二重引用符+オプションを使用してください-T

scp -T user@host:"'<path-with-spaces>'" <destination>
scp -T user@host:'"<path-with-spaces>"' <destination>
scp -T user@host:"\"<path-with-spaces>\"" <destination>

注:オプションがない場合、-Tこれらのコマンドはprotocol error: filename does not match request理由を詳しく説明します。ここ

printfのエスケープパスを使用してください。

source="<path-with-spaces>"
printf -v source "%q" "${source}"
scp user@host:"${source}" <destination>

注:このオプションはオプションなしでうまく機能します-Tが、単一のファイルに対してのみ機能します。複数のファイルの場合は、-Tオプションが必要です(上記と同じエラー)。

関連情報