Pull to refresh

Использование bash completion в командной строке, собственных скриптах и приложениях. Часть 1

Reading time2 min
Views56K
Часть 2

Системный администратор — человек ленивый. Обычно он старается сделать максимум работы, приложив минимум усилий, а для этого зачастую требуется автоматизировать многие рутинные процедуры. Например — набор полных имен хостов при создании ssh-соединения, или же длинных аргументов некоторых команд :)

Сегодня я попробую рассказать про использование такого функционала шелла как bash completion.

Итак, почти любая оболочка по умолчанию умеет добавлять пути к файлам и директориям:

root@mould:~# mkdir very_long_dir_name
root@mould:~# cd ve[Tab]
root@mould:~# cd very_long_dir_name/


bash (в моем случае) после нажатия клавиши Tab допишет имя диркетории (если его можно определить однозначно по первым набранным символам), или покажет варианты:

root@mould:~# ls .s[Tab]
.ssh/ .subversion/


Но при этом некоторые шеллы умеют дополнять не только пути, но и аргументы для ряда команд. Например:

root@mould:~# apt-get up[Tab]
update upgrade


Или даже более сложные конструкции:

root@mould:~# apt-get install bash-[Tab]
bash-builtins bash-completion bash-doc bash-minimal bash-static


За данный функционал в debain-based дистрибутивах (не могу ничего сказать про остальные) отвечает содержимое пакета bash-completion.
Для того, чтобы активировать возможности completion достаточно сделать следующее:

root@mould:~# . /etc/bash_completion

Или добавить такой вызов в ваш .bashrc файл, после чего перелогиниться:

if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi


Скорее всего это у вас уже написано, но закомментировано.
Попробуем начать использовать одно из самых часто требующихся комплишенов — дополнение имен хостов при доступе к ним по ssh.
Для начала потребуется отключить хеширование имен хостов в ~/.ssh/known_hosts. При «коробочных» настройках строка в этом файле выглядит примерно так:

|1|yVV33HmBny6RPYWkUB5aW+TksqQ=|f11ZL/FI9/Krfw2bqN0tBJeeq4w= ssh-rsa AAAAB3Nz__много-много-символов__2bYw==,

что нас не устроит.
После выставления значения HashKnownHosts No в конфиг-файле ssh-клиента (/etc/ssh/ssh_config или ~/.ssh/config), и очистки .ssh/known_hosts (иначе в него будут добавляться правильный строки только для новых хостов) мы получим удобочитаемый вариант записи в known_hosts после первой попытки залогинтся на хост:

mould,11.22.33.44 ssh-rsa AAAAB3NzaC1y__много-много-символов__c2EAANq6/Ww==.

А это, в свою очередь, позволит использовать комплишен имен при установке ssh-соединения:

veshij@dhcp250-203:~ $ ssh mould[Tab]
mould mould01e


Если в вашем «подчинении» более 5-10 машин это будет весьма удобно.
И, кстати, дополнение заработает не только для ssh, а еще для ряда других программ: ping, traceroute, telnet, etc. И не только по hostname, а еще и по ip-адресу.

Если эта тема окажется интересной, в следующей части могу рассказать, как настроить дополнение команд и аргументов для ваших собственных скриптов. Например, так:

root@mould:~# my_test_script --[Tab]
--help --kill-all-humans --conquer-the-world


Tags:
Hubs:
Total votes 58: ↑54 and ↓4+50
Comments43

Articles