我正在寻找一个功能,可以帮助我自动完成我“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
with的散列,以允许从所有历史记录HashKnownHosts no
中自动完成,或者仅在您的中列出您的主机(您可以在那里存储所有的and ,或创建别名)。~/.ssh/config
~/.ssh/config
Ports
Users
我很欣赏这种创造力,但是当我们已经拥有开箱即用的相同功能时,为什么要重新发明轮子(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
- 使输出线为uniqsed 's/^ssh //'
ssh
- 删除每行的开头字符串ssh
- 执行ssh
命令时
如果您不仅ssh hostname
使用 和 等其他功能ssh user@hostname
,则ssh user@hostname -p 2222
必须使用regex
和grep|sed
功能来仅保留hostname
或 任何您想要自动完成的内容
将完整的行插入到您的.bashrc
文件中,以便您在每次启动会话时都具有自动完成功能。