원격 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와 같은 다른 것을 사용할 수 있음)을 확인하고 따옴표를 이스케이프할 때 다음을 수행해야 합니다. 명시적으로 전달하세요. 또한 외부 쌍은 구문 분석 중에 종종 제거/제거됩니다.

command 를 사용하면 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 재분석 지점为名称中没有空格但指向有空格的文件(和文件夹)名称创建连接点和符号链接。有时,如果您的名称需要非常复杂的引用和转义,这是唯一可用的方法。

관련 정보