在歷史檔案中使用 SSH 時自動完成主機名

在歷史檔案中使用 SSH 時自動完成主機名

我正在尋找一個功能,可以幫助我自動完成我“sshed”的伺服器,並且在我的.bash_history文件中,而不會弄亂known_hosts文件/etc/bash_completition,或者只需從我的history.

我不能弄亂該known_hosts文件,因為其中的資訊就像“加密”一樣,並且尋找如何避免這種情況並不那麼重要。

例如

$ tail -n 2 ~/.ssh/known_hosts
|1|D90I41jNxFy83ZhAoyG7gj0+LpM=|Zkru+0Yi9Q9UNafHpj1IVMGGnAw= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEArih5PrEeGsMHm+9ytkiiOgNNIh6fQAEFfdDw9IwkOGs13g+YN6k61rRbdXj97N+vvuGslcCL9uDMY+M6bqDX4k2kGJuvmsSBgIWOjOiOtrW6wWaflGO0OKQ39F1R92Bw3gB1kNg8Es3XjNE1D+CRXt/EQLWLBFmF3p41PpoRg/Gyvw4XqQSMOYdGsr0OaE8ozrXWO2rQo2NDe6BDJzSGqZ234jCtnRLEtFBFvisTEbNCYFRkhKMSfrUecyK5bjHRehEHKfsPxNDTCOl7xrx1DDTng/BIgxyCA21s+xa05oNulkMMd/1qNrekoUUFxwJpb1rf6vrW5CkeMIOhCr5Nxw==
|1|Cl6c716uEoPmovaRDDwkM+bYFTc=|VXUrsTRDptMOg/Nm3anFMwjy5O8= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEArih5PrEeGsMHm+9ytkiiOgNNIh6fQAEFfdDw9IwkOGs13g+YN6k61rRbdXj97N+vvuGslcCL9uDMY+M6bqDX4k2kGJuvmsSBgIWOjOiOtrW6wWaflGO0OKQ39F1R92Bw3gB1kNg8Es3XjNE1D+CRXt/EQLWLBFmF3p41PpoRg/Gyvw4XqQSMOYdGsr0OaE8ozrXWO2rQo2NDe6BDJzSGqZ234jCtnRLEtFBFvisTEbNCYFRkhKMSfrUecyK5bjHRehEHKfsPxNDTCOl7xrx1DDTng/BIgxyCA21s+xa05oNulkMMd/1qNrekoUUFxwJpb1rf6vrW5CkeMIOhCr5Nxw==

我發現這個解決方案但由於其他不重要的原因,我沒有該~/.ssh/config文件。

答案1

更簡單的方法是在您的中known_hosts停用您的雜湊,以允許從所有歷史記錄中自動完成,或僅在您的中列出您的主機(您可以在那裡儲存所有的和,或建立別名) 。HashKnownHosts no~/.ssh/config~/.ssh/configPortsUsers

我很欣賞這種創造力,但是當我們已經擁有開箱即用的相同功能時,為什麼還要重新發明輪子(HashKnownHosts yes預設的 Ubuntu 除外,這會破壞此功能)。

答案2

因此,由於我只想知道如何自動完成bash_history文件中的主機目標,因此我發現此功能希望能夠幫助處於相同情況的任何人。

只需執行以下行

$ complete -W "$(echo $(grep '^ssh ' .bash_history | sort -u | sed 's/^ssh //'))" ssh
  • complete- 是 bash 內建函數。所以系統上沒有二進位。它處理按下時如何完成命令
  • -W- 製作自動完成單字列表
  • grep '^ssh' .bash_history.bash_history- 從檔案傳回所有以 ssh 開頭的行
  • sort -u- 使輸出線為uniq
  • sed 's/^ssh //'ssh- 刪除每行的開頭字串
  • ssh- 執行ssh指令時

如果您不僅ssh hostname使用 和 等其他功能ssh user@hostname,則ssh user@hostname -p 2222必須使用regexgrep|sed功能僅保留hostname或 任何您想要自動完成的內容

將完整的行插入到您的.bashrc文件中,以便您在每次啟動會話時都具有自動完成功能。

相關內容