ファイルにスペースがある場合にscpを使用してリモートホストからファイルをコピーする方法

ファイルにスペースがある場合にscpを使用してリモートホストからファイルをコピーする方法

リモートホストからファイルにスペースが含まれているローカルディレクトリにファイルをコピーするには、scmを使用する必要があります。それ以外の場合は、そのホストにsshを使用して問題を解決し、ファイルを再度scpします。しかし、ファイルをコピーする方法を知りたいです。たとえば、ローカルホストにsshdがインストールされていない可能性があります。

私はこれを試しました:

scp [email protected]:~/download/file\ that\ have\ spaces.txt ~/download/

しかし、エラーが発生しました。

scp: /home/kuba/Pobrane/file: No such file or directory
scp: that: No such file or directory
scp: have: No such file or directory
scp: spaces.txt: No such file or directory

私もfile\\ that\\ have\\ spaces.txt試しましたfile%20that%20have%20spaces.txt

ベストアンサー1

SSHはサーバーからシェルを呼び出します(これをバイパスする方法はありません)。 scpは、このシェルを呼び出して作成する必要があるファイルの名前を示します。 scp は、ファイル名で渡すすべてがリモートシェルコマンドに直接挿入されるように設計されています。これは、ファイル名にシェル特殊文字(通常のUnixシェルではスペースを意味します)がある場合!"#$&'()*-;<=>?@[\]^`{|}~(一部は名前のシェルと場所によって異なります)、これを2回引用する必要があることを意味します。ローカルシェルの場合、一度、かつてこれを参照するために使用されました。リモートシェル用に一度。

これは特にワイルドカード文字を指定できるという利点があります。また、リモートホームディレクトリを使用することもできます~(ただし、ファイル名はリモートホームディレクトリに相対的であるため、[email protected]:download/…代わりに使用できます[email protected]:~/download/…)。欠点は、ファイル名に特殊文字が含まれるときに注意する必要があることです。サーバーで許可されているファイル名をフィルタリングする場合にも注意する必要があります(特にシェルコマンドの権限を持たない制限付きアカウント)。

2回引用する簡単な方法は、フルネームの周りに一重引用符を使用し、リモート側で保護する必要がある各特殊文字の前にバックスラッシュを使用することです。これはファイル名の一重引用符には適用されません。これを4文字でエスケープします'\''。あなたの例では:

scp '[email protected]:download/file\ that\ have\ spaces.txt' ~/download/

2つのバックスラッシュを使用した試みは機能しません。これは\\ 、ローカルシェルがこれをバックスラッシュと引数を区切る空白に解析するためです。バックスラッシュスペースをリモートホストに送信し、バックスラッシュとスペースの両方が必要です。ローカルシェルによって解析されるため、両方とも前にバックスラッシュが必要です。つまり、3つのバックスラッシュとスペースが必要です。

scp [email protected]:download/file\\\ that\\\ have\\\ spaces.txt ~/download/

SFTPはシェルを通過しないため、特殊文字の問題を回避する方法です。SSHFSSFTPに基づいて構築され、直接リモートファイルアクセスを提供するので、次のことができます。

mkdir remote
sshfs [email protected]: remote
cp remote/download/file\ that\ have\ spaces.txt ~/download/
fusermount -u remote
rmdir remote

おすすめ記事