Bash
需要幫助理解帶有管道、重定向和遠端連接的 shell 命令
我有一些使用 bash 的經驗,但是我在教程中看到的這個命令讓我措手不及:
cat ~/.ssh/id_rsa.pub | ssh git@remote-server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
我知道命令的作用。它獲取文件的輸出
~/.ssh/id_rsa.pub
,然後ssh
s 到遠端伺服器,在使用者主目錄下創建一個名為 .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