Оптимизация работы с SSH с помощью bash-completion. Часть 2

()

Итак. Полгода назад на этом сайте была опубликована заметка «Оптимизация работы с SSH с помощью bash-completion». В ней говорилось об упрощении набора имён хостов, однако описанный там способ не свободен от недостатков, поскольку список хостов для автодополнения там определён достаточно жёстко и менять его не очень удобно.

Ниже предлагается более интересный способ, который позволяет брать имена хостов из файла ~/.ssh/known_hosts. Т.е. фактически при автодополнении будут показаны все хосты, на которые когда либо логинился пользователь.

По умолчанию в последних версиях OpenSSH имена хостов хэшируются. В нашем случае это будет мешать, и потому нужно отключить хэширование добавив строчку:

HashKnownHosts no

В файл ~/.ssh/ssh_config.

Далее удаляем (если есть) старую запись complete для ssh из ~/.bashrc и вместо неё добавляем следующую:

complete -W "`cat ~/.ssh/known_hosts | cut -d ' ' -f1 | cut -d ',' -f1 | cut -d ']' -f1 | sed 's/\[//' | sort`" ssh

Всё! Идея в том, что команда:

cat ~/.ssh/known_hosts | cut -d ' ' -f1 | cut -d ',' -f1 | cut -d ']' -f1 | sed 's/\[//' | sort

Парсит файл ~/.ssh/known_hosts, выбирая из него имена хостов.

Желаю приятной работы!:)

Ключевые слова: ssh, bash, bash_completion.

Комментарии:

answer 2008-05-05 12:52:48 (#)

Я кажется наверное глуп, по скольку не понял всей сути сложной и длинной команды?

cat ~/.ssh/known_hosts | cut -f1 -d " " | sort
И хватит.
А вот вырезать [] я бы не рекомендовал, т.к. Вы сами потом через месяц не вспомните на какой порт удаленной машины вы соединялись. При малом кол-ве машин упомнить можно, но если как у меня:
answer@cyber:/home/answer>cat ~/.ssh/known_hosts | wc -l
891

MooSE 2008-05-05 13:08:16 (#)

Ну это уже дело вкуса:) Главное понятна идея. А порты я в голов не плохо держу.

А вообще есть идея написать скрипт-wrapper для SSH которому можно передавать хост и порт ввиде host:port.

Hubbitus 2008-05-10 21:54:49 (#)

Круто!
Спасибо большое.

Впрочем комманда выдирания самих хостов не требует столько конвееров и значительно проще может быть:
complete -W "`awk 'BEGIN {FS=" |,"} {print $1}' ~/.ssh/known_hosts | sort`" ssh
Новый комментарий



© 2006-2016 Вадим Калинников aka MooSE

Loctite смотрите на сайте ООО Рубинис. Промышленный клей локтайт.