파일을 복사하려고 할 때 scp 오류가 발생했습니다.

파일을 복사하려고 할 때 scp 오류가 발생했습니다.

나는 scpAndroid 장치에서 MacBook으로 파일을 자주 전송하는데 이것이 정말 매력적입니다. 하지만 John's folder내 MacBook에는 폴더라는 폴더가 있으므로 해당 디렉터리에 파일을 복사하려고 하면 다음과 같습니다. scp [email protected]:/Users/macbook/desktop/John\'s\ folder/file storage/folder

오류가 반환됩니다

unexpected EOF error while looking for matching \`’\`

그리고

unexpected end of file

이 문제를 어떻게 해결할 수 있나요?

답변1

~처럼OpenSSH 버전 9.02022-04-08에 게시된 이 scp프로그램은 이제 SFTP 프로토콜을 직접 사용합니다. 따라서 원래 질문은 더 이상 존재하지 않으므로 이 답변의 나머지 부분은 더 이상 필요하지 않습니다.

이전 버전의 SCP를 사용 중이 scp거나 이전 SCP 프로토콜로 되돌리려는 경우 scp -O답변은 여전히 ​​적용됩니다.

원래 답변은 아래에 있습니다.


흥미 롭군. 내가 본 다른 답변에서는 이스케이프된 따옴표와 이스케이프된 공백을 따옴표 붙은 문자열로 바꾸라고 알려줍니다. 실제로는 동일하므로 변경 사항이 표시되지 않습니다( a\'\ bshell 과 동일 "a' b").

scp여기서 문제는원격 시스템주어진 명령줄을 해석하십시오.

예를 들어 다음과 같이 작동합니다.

scp John\'s\ folder/file localhost:/tmp/dst

그러나 이것은 실패합니다.

scp localhost:/tmp/src/John\'s\ folder/file /tmp/dst

localhost( 예시 로 사용하였으니 user@host상황에 맞게 사용하시면 됩니다.)

(-v말 수가 많은) 플래그를 사용하면 scp실패의 원인을 정확히 확인할 수 있습니다.

debug1: Sending command: scp -v -f /tmp/src/John's folder/file
bash: -c: line 0: unexpected EOF while looking for matching `''
bash: -c: line 1: syntax error: unexpected end of file

여기서 불행한 해결책은 특수 문자(공백 포함)를 두 번(로컬 셸에서 한 번, 원격 셸에서 한 번) 이스케이프해야 한다는 것입니다.

scp localhost:"/tmp/src/John\'s\ folder/file" /tmp/dst

답변2

SCP에서는 전체 매개변수를 따옴표로 묶어야 합니다. 내 앞에 있는 두 가지 다른 답변은 부분적으로 정답이지만 정답은

scp "[email protected]:/Users/macbook/desktop/John's folder/file" storage/folder

첫 번째 인수는 따옴표로 묶여 있지만 두 번째 인수는 그렇지 않습니다. 주석에서 알 수 있듯이 두 인수가 모두 따옴표로 묶인 경우 /bin/scp는 이를 단일 인수로 호출하고 그 후에는 다른 매개 변수가 필요합니다.

scp "[email protected]:/Users/macbook/desktop/John's folder/file storage/folder"단일 인수로 읽혀집니다. 거기에 공백이 있어도 큰따옴표를 사용하면 공백을 피할 수 있습니다.

마지막으로 매개변수 중간에 따옴표를 붙이면 매개변수가 반으로 줄어들고 user@host:/path/to/directory는 완전한 매개변수이므로 쉘에 아무런 의미가 없습니다. 그 중 일부를 사용할 수 있지만 반으로 잘라낼 수는 없습니다. 그렇지 않으면 2개의 다른 매개변수로 처리됩니다.scp [email protected]:"/Users/macbook/desktop/John's folder/file" storage/folder

답변3

삼중 탈출은 나에게 효과적이었습니다.

scp [email protected]:bob\\\'s\\\ file /local/path/

이것들도 작동합니다:

scp "[email protected]:bob\'s\ file" /local/path/
scp [email protected]:"bob\'s\ file" /local/path/

이것들은 다음이 아닙니다:

scp "[email protected]:bob's file" /local/path/
scp [email protected]:bob\'s\ file /local/path/

관련 정보