遠端 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 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-addressdir 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 重新分析點為名稱中沒有空格但指向有空格的檔案(和資料夾)名稱建立連接點和符號連結。有時,如果您的名稱需要非常複雜的引用和轉義,這是唯一可用的方法。

相關內容