Archive for the ‘shell’ Category

Конфиги для bash

Июнь 16, 2010

Практически у каждого гуманоида, обреченного возиться с консолью, есть набор конфигурационных файлов, который собирается годами и содержит мудрость предков и пыль веков. И каждый неофит, постигший необходимость настройки bash под свои нужды, прежде всего стучится в гугл и тратит достаточно большое количество времени на чтение чужих конфигов.
Огромное число их можно откопать на GitHub. Есть даже специальный сайт, где сложено 1474 (на данный момент) конфиг-файла (там правда все в кучу .vimrc, .bashrc, .zshrc и т.д.).
Но в хранении конфигов есть один тонкий момент, с которым приходится сталкиваться любому, кто растит их некоторое время. Во-первых, они становятся довольно объемными и, следовательно, трудно поддерживаемыми, а во-вторых, часты бывают нужны разные настройки для разных машин.
Если обратиться к интернетам в поисках мудрости, то довольно часто рекомендуют простейший расклад, когда создается три файла:


aliases - разные удобные сокращения (alias lsa='ls -lha')
config  - настройки самого bash (export HISTSIZE=10000)
env     - настройки среды окружения (export LANG=en_EN.UTF-8)

Плюс еще пара файлов, которые это все загружают: bashrc и bash_profile
Данное решение нацелено на структуризацию и просто предлагает не сваливать все в кучу, а как-то разнести по темам. В принципе, это лучше, чем один .bashrc на 1500 строк.
Но проблема того, что на linux-сервере нам совершенно невозможно иметь TextMate, который стоит редактором по-умолчанию на mac-машине остается в силе, не говоря уже о различных PATH-переменных окружения, которые могут внести некоторую путаницу.
При этом я предполагаю, что мы храним все где-то в системе контроля версий на удаленном сервере (я храню на GitHub) и используем на каждой машине, где нам выдают шелл. Можно поколдовать с .gitignore и не пушить в репозиторий host-specific файлы, но не хочется их разом потерять вместе с внезапно сгоревшим хардом. Поэтому я решил немного допилить напильником изначальный расклад и вот, что получилось:


aliases         - общие aliases
config          - общий config 
hostname        - директория для host-specific файлов
    server-1    - очень боевой сервер
    dev-1       - сильно разработческая машина
platform        - директория для platform-specific файлов
    darwin      - все, что относится к миру mac
    linux       - все, что относится к миру суровых linux
scripts         - директория со вспомогательными скриптами
bashrc          - файл, который подгружает весь этот зоопарк

В самом bashrc есть только загрузка нужных файлов, выглядит это так:


droot=~/.dotfiles/bash

# Load common files
. ${droot}/config
. ${droot}/aliases

# Load platform-specific shortcuts
platform=`uname | awk '{print tolower($0)}'`
if [ -f ${droot}/platform/${platform} ]; then
    . ${droot}/platform/${platform}
fi

# Load machine-specific files, if presented
hostname=`hostname -s`
if [ -f ${droot}/hostname/${hostname} ]; then
    . ${droot}/hostname/${hostname}
fi

Теперь можно продолжать наращивать парк серверов и не бояться, что конфиги для bash распухнут до полной неюзабельности. А я, тем временем, все еще посматриваю в сторону zsh и все надеюсь как-нибудь перебраться на него в качестве каждодневного шелла.

Автодополнение ssh хостов

Март 31, 2010

Автодополнение хостов ssh — это благо, особенно, когда их набивается достаточно много. Одной из хороших подсказок является создание файла ~/.ssh/config с примерно таким содержанием:


Host        myhost      # Имя хоста
HostName    server.com  # Это удаленнй хост
User        username    # Пользователь на удаленном хосте
Port        22222       # Номер порта

Этот файл является очень хорошим подспорьем, особенно если вы устроили коннект по ключу. Тогда запоминать надо только пароль от ключа и имя хоста из нашего конфига. Но иногда и этого бывает не достаточно. Точнее уже бывает лень набирать даже ssh myhost и хочется автодополнения. На этот случай можно поискать в интернетах скрипты bash ssh autocompletion, но они все опираются на файлик known_hosts, а мне хотелось бы чтобы автодополнение шло по именам из конфига. Нет ничего проще. Стоит добавить пару строк к себе в ~/.bashrc или ~/.profile:


# SSH Auto Completion of Remote Hosts
complete -W "$(echo `cat ~/.ssh/config | grep '^Host ' | colrm 1 5`)" ssh