ファイルにスペースが含まれているファイルをリモート ホストからローカル ディレクトリに 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 回引用符で囲む必要があります。1 回はローカル シェル用、もう 1 回はリモート シェル用です。
これには利点があり、特にワイルドカードを指定できます。また、~
リモート ホーム ディレクトリに を使用することもできます (ただし、ファイル名はリモート ホーム ディレクトリに相対的であるため、[email protected]:download/…
の代わりにを使用する[email protected]:~/download/…
こともできます)。ただし、ファイル名に特殊文字が含まれている場合は注意が必要です。サーバー上で許可されたファイル名をフィルターする場合も注意が必要です (特に、シェル コマンド権限を持たない制限付きアカウントの場合)。
二重引用符を使用する簡単な方法は、名前全体を一重引用符で囲み、リモート側で保護する必要があるすべての特殊文字の前にバックスラッシュを使用することです。これはファイル名内の一重引用符には機能しません。これらは 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
答え2
解決策は、引用符とエスケープされたスペースの両方を使用することです。
scp "[email protected]:~/download/file\ that\ have\ spaces.txt" ~/download/