Автозаполнение имен хостов при использовании 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в вашем, ~/.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файл, чтобы функция автозаполнения работала при каждом запуске сеанса.

Связанный контент