在历史文件中使用 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_hostswith的散列,以允许从所有历史记录HashKnownHosts no中自动完成,或者仅在您的中列出您的主机(您可以在那里存储所有的and ,或创建别名)。~/.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文件中,以便您在每次启动会话时都具有自动完成功能。

相关内容