원격 호스트에서 파일에 공백이 있는 로컬 디렉터리로 파일을 복사하려면 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 쉘에서는 공백을 의미함)가 있는 경우 !"#$&'()*-;<=>?@[\]^`{|}~
(일부는 이름의 쉘과 위치에 따라 다름) 이를 두 번 인용해야 함을 의미합니다. 로컬 쉘의 경우 한 번 , 한때 이를 참조하는 데 사용되었습니다. 원격 쉘용으로 한 번.
이는 특히 와일드카드 문자를 지정할 수 있다는 장점이 있습니다. 또한 원격 홈 디렉토리를 사용할 수도 있습니다 ~
(그러나 파일 이름은 원격 홈 디렉토리에 상대적이므로 [email protected]:download/…
대신 사용할 수 있습니다 [email protected]:~/download/…
). 단점은 파일 이름에 특수 문자가 포함될 때 주의해야 한다는 것입니다. 서버에서 허용되는 파일 이름을 필터링하려는 경우에도 주의해야 합니다(특히 쉘 명령 권한이 없는 제한된 계정).
두 번 인용하는 쉬운 방법은 전체 이름 주위에 작은따옴표를 사용하고 원격 측에서 보호해야 하는 각 특수 문자 앞에 백슬래시를 사용하는 것입니다. 이는 파일 이름의 작은따옴표에는 적용되지 않습니다. 이를 4자로 이스케이프합니다 '\''
. 귀하의 예에서 :
scp '[email protected]:download/file\ that\ have\ spaces.txt' ~/download/
두 개의 백슬래시를 사용한 시도는 작동하지 않습니다. 왜냐하면 \\
로컬 셸이 이를 백슬래시와 인수를 구분하는 공백으로 구문 분석하기 때문입니다. 백슬래시 공백을 원격 호스트에 보내야 하고 백슬래시와 공백이 모두 필요합니다. 로컬 쉘에 의해 구문 분석되므로 둘 다 앞에 백슬래시가 필요합니다. 즉, 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/