![遠端 Windows 機器上的 SSH + DIR 命令](https://rvso.com/image/192249/%E9%81%A0%E7%AB%AF%20Windows%20%E6%A9%9F%E5%99%A8%E4%B8%8A%E7%9A%84%20SSH%20%2B%20DIR%20%E5%91%BD%E4%BB%A4.png)
我在 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 shell 中使用雙引號列印路徑,如下所示:
"c:\teste folder"
雙引號已經用於透過 SSH 將命令傳送到 Windows,要將雙引號傳送到 Windows shell,您需要使用雙引號的反斜杠\"
,命令如下所示:
ssh user@ip-address "dir \"c:\teste folder\""
對於那些將來有同樣疑問的人來說,它仍然是一個幫助。
答案2
首先,一定要檢查引用、對 shell 有效的規則(該命令在本地 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
。這也常用於「縮短」很長的路徑:subst gd:/an/insanely/long/path/to/my/personal/folder/of/favorite/games
會讓你使用“g:”而不是總是輸入完整路徑。
- 在現代 Windows 系統中的 NTFS 下,您可以使用NTFS 重新分析點為名稱中沒有空格但指向有空格的檔案(和資料夾)名稱建立連接點和符號連結。有時,如果您的名稱需要非常複雜的引用和轉義,這是唯一可用的方法。