원격 Windows 시스템의 SSH + DIR 명령

원격 Windows 시스템의 SSH + DIR 명령

Windows Server 2008 r2에 OpenSSH를 설치하고 공개 키를 그곳으로 내보냈습니다. 비밀번호를 입력하지 않고도 정상적으로 연결할 수 있으며, 연결하는 데 사용하는 명령에 이미 DIR 명령을 실행할 수도 있습니다.

ssh user@ip-address "dir c:\testfolder"

그러나 이름에 공백이 있는 디렉터리에서 DIR 명령을 실행하면 다음과 같습니다.

ssh user@ip-address "dir c:\test folder"

작동하지 않습니다.

이름에 공백이 있는 폴더에서 dir 명령을 실행하는 올바른 방법을 아는 사람이 있습니까? 미리 감사드립니다.

답변1

프로그래머인 친구가 나에게 이 문제를 해결하는 방법을 가르쳐주었습니다. 다음과 같이 큰따옴표를 사용하여 Windows 셸에 경로를 인쇄하려면 어떻게 해야 합니까?

"c:\teste folder"

그리고 큰따옴표는 이미 SSH를 통해 Windows에 명령을 보내는 데 사용되며, 큰따옴표를 큰따옴표와 함께 백슬래시를 사용해야 하는 Windows 셸에 큰따옴표를 보내려면 \"명령은 다음과 같습니다.

ssh user@ip-address "dir \"c:\teste folder\""

앞으로도 같은 의심을 품고 있는 사람들에게 도움이 될 것입니다.

참고 자료

답변2

먼저, 항상 인용, 인용과 관련된 쉘에 적용되는 규칙(명령은 bash에서 로컬로 실행되지만 원격 측에서는 Windows의 cmd.exe와 같은 다른 것을 사용할 수 있음) 및 인용을 이스케이프해야 하는 경우를 확인하십시오. 명시적으로 전달해야 합니다. 또한 외부 쌍은 구문 분석 중에 종종 제거/제거됩니다.

명령을 사용하면 ssh user@ip-address "dir c:\\testfolder"bash는 명령의 세 부분을 확인합니다.

ssh
user@ip-address
dir c:\test folder

특히 bash는 마지막 항목 주위에 따옴표를 포함하지 않습니다! 그 이유는 이 단계에서 bash는 인용문을 사용하여 bash 자체에 인용된 텍스트를 하나의 부분(bash의 메모리 공간에 하나의 문자열에 저장됨)으로 해석하도록 지시한다고 가정하기 때문입니다.

Bash가 명령을 ssh에 전달하면 ssh는 마지막 두 부분인 user@ip-address및 를 확인합니다 dir c:\test folder. shh는 첫 번째 부분을 사용하여 연결할 위치를 결정하고 일단 연결되면 두 번째 부분을 그대로 원격 끝에 전달합니다. 그러나 따옴표는 이미 제거되었습니다.

원격 측에서는 sshd(ssh 데몬/서비스)가 이를 수신하여 cmd.exe(Windows 측이므로)에 전달합니다. 다음과 같이 두 부분이 아니라 세 부분입니다.

dir
c:\test
folder

의도한 바는 아니었습니다. 따라서 필요에 따라 이스케이프를 사용하여 따옴표가 명령에서 명령으로 전달되도록 해야 합니다. 일부 명령은 처리하는 동안 따옴표를 제거하고 다른 명령은 있는 그대로 전달합니다.

따라서 올바르게 인용되고 이스케이프된 최종 명령은 다음과 같습니다.

ssh user@ip-address "dir \"c:/test folder\""

이 경우에는 c:\도 c:/로 변경했습니다. 최신 cmd.exe는 대부분의 위치에서 /를 허용합니다. 이는 명령에서 \가 이스케이프 시퀀스 자체로 해석되는 것을 방지하기 위해 추가로 이스케이프해야 하는 고대 문제를 피하는 데 도움이 됩니다. ("해커"는 잘못 설계된 응용 프로그램에서 개행 문자로 확장되는 "\n"을 삽입하여 이 문제를 코드 삽입 도구로 오랫동안 사용해 왔습니다.)

"\"를 유지하는 경우 "\\"로 이스케이프해야 할 수도 있습니다. (이것은매우실제로 일반적인 문제입니다! 이 게시물을 올바르게 표시하려면 여러 번 편집해야 했습니다. 이것은 "지옥 탈출"이라고도 알려져 있습니다. 참조이스케이프 시퀀스 Wiki 항목상세 사항은.)

Windows에는 기본 문제(공백이 포함된 파일 이름)를 처리하는 다른 방법이 있습니다.

  • 명령을 사용하여 드라이브 문자를 전체 경로에 매핑할 수 있습니다 subst. 이는 매우 긴 경로를 "단축"하는 데에도 자주 사용됩니다.

    하위 gd:/an/insanely/long/path/to/my/personal/folder/of/favorite/games

항상 전체 경로를 입력하는 대신 "g:"를 사용할 수 있습니다.

  • 최신 Windows 시스템의 NTFS에서는 다음을 사용할 수 있습니다.NTFS 재분석 지점이름에 공백이 없지만 공백이 있는 파일(및 폴더) 이름에 대한 연결 지점 및 기호 링크를 생성합니다. 때때로 이것은 매우 복잡한 인용 및 이스케이프가 필요한 이름이 있는 경우 사용할 수 있는 유일한 방법입니다.

관련 정보