Bash

需要幫助理解帶有管道、重定向和遠端連接的 shell 命令

  • May 5, 2020

我有一些使用 bash 的經驗,但是我在教程中看到的這個命令讓我措手不及:

cat ~/.ssh/id_rsa.pub | ssh git@remote-server "mkdir -p ~/.ssh && cat >>  ~/.ssh/authorized_keys"

我知道命令的作用。它獲取文件的輸出~/.ssh/id_rsa.pub,然後sshs 到遠端伺服器,在使用者主目錄下創建一個名為 .ssh 的新目錄,然後創建一個名為的新文件authorized_keys並將其內容id_rsa.pub倒入該文件中。我想不通的是,此時id_rsa.pub文件的內容被注入到授權的密鑰文件中。

因此,我知道管道 (|) 將輸出帶到其左側並將其饋送到其右側的命令。但通常我們使用 cat 命令是這樣的:

cat "content_to_be_added" >> file_to_be_appended

所以,如果我沒記錯的話,id_rsa.pub應該在 >> 之前註入的內容才能使它起作用。那麼,這個功能究竟是如何運作的,為什麼?

順便說一句,請隨時更正我的術語。如果您能告訴我這裡的操作員>>是否有特定名稱,我也將不勝感激。

命令

cat >> ~/.ssh/authorized_keys

從標準輸入讀取(因為沒有指定要cat讀取的文件名)並附加到命名文件。>>重定向運算符打開目標文件以追加. 在寫入數據之前使用>代替>>會截斷(清空)目標文件。

該遠端命令的標準輸入數據cat來自哪裡?標準輸入流是cat從遠端 shell 繼承的。遠端 shell 從ssh. 的標準輸入ssh來自cat讀取~/.ssh/id_rsa.pub文件的本地命令的管道。


cat您的管道中不需要本地:

ssh git@remote-server 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub

但是請注意,如果mkdir確實創建了一個目錄,則該目錄需要具有正確的權限ssh才能正常工作:

ssh git@remote-server 'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub

或者,您可能只是選擇不附加數據:

ssh git@remote-server 'cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub

引用自:https://unix.stackexchange.com/questions/584686