Ssh

通過遠端 SSH 連接使用 rsync 時在遠端路徑中轉義空格

  • August 8, 2021

使用 SSH 將 rsync 連接到遠端伺服器時,如何轉義遠端路徑中的空格等?一個簡單的反斜杠轉義了本地 bash 提示符的空間,但在遠端電腦上,該空間隨後被讀取為路徑中的中斷,從而標記了該路徑的結尾。

因此,當我這樣做rsync -avz /path/to/source/some\ dir/ user@host.tld:/path/to/dest/some\ dir/時,遠端伺服器正在讀取它/path/to/dest/some/,因為它無法遠端找到該目的地,因為實際目的地是“某個目錄”而不僅僅是“某個”。

如果我嘗試相同的命令並轉義反斜杠和空格以通過本地 bash 提示符並維護遠端伺服器的反斜杠(總共三個反斜杠:)/path/to/dest/some\\\ dir/,它確實將反斜杠發送到遠端伺服器,但遠端伺服器然後將路徑解釋為/path/to/dest/some\/而不是/path/to/dest/some\ dir/仍然剝離空間和其後的字元。

如果我嘗試用引號包裹路徑,它的行為幾乎相同,有效地在空間處切斷路徑。所以它也只能通過本地 bash 提示符。

最初,我使用的路徑中有一個“ - ”(空格連字元空格)段,遠端伺服器返回一個錯誤rsync: on remote machine: -: unknown option,這就是整個空間轉義工作的開始。

那麼我必須怎麼做才能讓遠端伺服器正常工作,而不必從遠端路徑中刪除空格或其他錯誤字元(如連字元)?

在啟動器機器上,rsync建構一個命令行,在遠端機器上呼叫 rsync 目標,然後使用 ssh….作為單個字元串發送該命令行。該單個字元串被傳遞給 shell 進行解析、拆分為參數並執行rsync。我不知道為什麼要這樣做,而不是將某些二進制安全容器中的(已經拆分、擴展和未引用的)參數打包到遠端 rsync。

這意味著您的參數將被兩個不同的 shell 解析,相應地引用和重新引用。通常,我用雙引號包裹每個參數,然後用單引號包裹整個表達式。有時這還不夠,或者如果您希望在本地和遠端使用相同的表達式,這可能會很複雜。

在這種情況下,我通常會設置一些帶有簡單、無空格、全 ASCII 名稱的軟連結,然後使用它。

引用自:https://serverfault.com/questions/234876