![Автозаполнение имен хостов при использовании SSH в файле истории](https://rvso.com/image/89155/%D0%90%D0%B2%D1%82%D0%BE%D0%B7%D0%B0%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B8%D0%BC%D0%B5%D0%BD%20%D1%85%D0%BE%D1%81%D1%82%D0%BE%D0%B2%20%D0%BF%D1%80%D0%B8%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20SSH%20%D0%B2%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B5%20%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8.png)
Я ищу функцию, которая поможет мне автоматически заполнять серверы, на которых я когда-либо "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
в вашем, ~/.ssh/config
чтобы разрешить автозаполнение из всей истории, или просто перечислить ваши хосты в вашем ~/.ssh/config
(вы можете хранить там все ваши Ports
и Users
, или создавать псевдонимы).
Я ценю креативность, но зачем изобретать велосипед, если у нас уже есть та же функциональность из коробки (за исключением Ubuntu, поставляемой HashKnownHosts yes
по умолчанию, которая эту функциональность ломает).
решение2
Так как я хочу знать только то, как автоматически заполнять цели моих хостов в bash_history
файле, я нашел эту функцию в надежде помочь кому-нибудь в такой же ситуации.
Просто выполните следующую строку
$ complete -W "$(echo $(grep '^ssh ' .bash_history | sort -u | sed 's/^ssh //'))" ssh
complete
- встроенная функция bash. Поэтому в системе нет двоичного файла. Он управляет тем, как будут завершаться команды при нажатии-W
- создать список слов для автодополненияgrep '^ssh' .bash_history
- вернуть все строки, начинающиеся с ssh из.bash_history
файлаsort -u
- сделать выходные строки уникальнымиsed 's/^ssh //'
- удалить начальнуюssh
строку из каждой строкиssh
- при выполненииssh
команды
Если вы не только ssh hostname
и используете другие, такие как ssh user@hostname
или ssh user@hostname -p 2222
вы должны поиграть с функциями regex
и grep|sed
, чтобы сохранить только hostname
или то, что вы хотите автозаполнить
Вставьте полную строку в .bashrc
файл, чтобы функция автозаполнения работала при каждом запуске сеанса.