보안 복사(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
파일 이름을 두 번 인용해야 합니다. 한 번은 로컬 셸이고 한 번은 원격 셸입니다. 가장 간단한 경우에는 다음 중 하나를 수행할 수 있습니다.
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
scp
rsync
원격 파일 이름을 원격 쉘에 전달합니다 . 이를 통해 다음과 같은 패턴을 전달할 수 있습니다.
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
옵션이 다시 필요합니다(위와 동일한 오류).