google web font

пятница, 4 марта 2011 г.

alias против скриптов и правильная настройка против всех

Итак, я уже выяснил (и всем рассказал), что круче: alias'ы или функции, определённые в текущей интерактивной сессии командной оболочки. Кстати, рассуждения про bash-replay тоже иллюстрируют беспомощность alias'ов. Но мне не хотелось бы утверждать, что alias'ы не нужны, бесполезны, слабы в функциональном плане или что-то подобное. Как говорит один мой знакомый, «фичи всякие нужны, фичи всякие важны». Ранее я обещал вернуться к теме скриптов, с помощью которых можно легко и изящно устанавливать ssh-сессии с несколькими серверами. На этом примере я и покажу, что alias очень даже конкурентоспособен.


Полезный совет начинающему сисадмину, с которым я хотел поспорить, звучал так: создайте каталог ~/bin/, добавьте его в $PATH, напишите скрипт с таким содержанием:
#!/bin/bash
ssh "$0" "$@"
и делайте на него симлинки вида username@servername -> ~/bin/ssh_script. Плюсы: теперь консоль умеет автодополнять имя пользователя и адрес сервера, а если параметры соединения отличаются от дефолтных, но одинаковые на всех серверах, то их можно прописать в скрипте и больше не вводить. Минусы: на самом деле мы сэкономили ввод всего четырёх символов: 'ssh ', взамен мы отдали место на диске под скрипт и симлинки на него.

Даже банальный alias srv1='ssh username@servername1' дал бы больше пользы: теперь уже вся команда укладывается в 4 символа. И можно прописывать уникальные параметры доступа для каждого сервера. Единственное, что неудобно, по сравнению с предыдущим вариантом — это создавать эти алиасы: открыть файл и вписать в него длинную строчку vs сделать симлинк на более короткую строчку. Однако тут в дело можно пустить встроенный в голову оптимизатор: выделяем файл для alias'ов, подключаем его в ~/.bashrc (командой source $SSH_ALIASES_FILE), пишем функцию:
function add_ssh_alias {
  ALIASNAME=$1
  shift
  eval "alias $ALIASNAME='$@'"
  echo "alias $ALIASNAME='$@'" >> $SSH_ALIASES_FILE
}
Первый раз присоединяемся к нужному серверу с нужными параметрами, а после завершения сессии создаём нужный нам alias:
localuser@localhost /tmp $ ssh -p 23 -i ~/.ssh/id_rsa username@server1
username@server1 ~ $ exit
localuser@localhost /tmp $ add_ssh_alias srv1 !!
add_ssh_alias srv1 ssh -p 23 -i ~/.ssh/id_rsa username@server1
localuser@localhost /tmp $ alias srv1
alias srv1='ssh -p 23 -i /home/localuser/.ssh/id_rsa username@server1'
localuser@localhost /tmp $ sr<TAB>
srptool  srv1     
localuser@localhost /tmp $ 
Как легко можно заметить, у нас и автодополнение есть, и индивидуальные параметры, и создавать такой alias не сложнее, чем тот симлинк. Архитектурно вариант с alias'ом более правильный, более оптимальный, и, как мне кажется, более удобный. По поводу суперкомбо !! я писал в прошлый раз: он вставляет всю предыдущую команду.

Но кое что в этом решении мне не нравится. Дело в том, что оно тоже сделано через жопу, как и тот скрипт. Во-первых, если уж писать скрипт, который принимает в качестве параметров только своё имя, то писать его так:
localuser@localhost /tmp $ cat script 
#!/usr/bin/ssh
Я только что в красках объяснил, что такое sha-bang (# — это sharp, ! — это bang), зачем в начале каждого скрипта пишется такая строчка, что она обозначает и как с её помощью можно творить чудеса. Попробуйте вместо /usr/bin/ssh написать /bin/echo, чтобы стало попонятней. А потом — /bin/rm, чтобы развеять последние сомнения.

Во вторых, автодополнение для аргументов команды ssh встроенными средствами есть и в bash, и в zsh. Для этого просто нужно использовать то средство, которое предназначено как раз для настройки ssh-клиента: ~/.ssh/config. Почитать про него можно man ssh_config. Этот файл позволяет:
  • задать дефолтные настройки для ssh-соединения с хостом, на который нужно будет получать регулярный удалённый доступ. Это порт, IP-адрес, имя пользователя, имя ключа, проброс переменных окружения, сжатие, шифрование и всё, что вообще можно настроить для ssh.
  • задать короткое или наоборот длинное, но более понятное имя для хоста. Например, вместо ssh.private.name-no.ru можно указать name-no и потом соединяться с ним просто командой ssh name-no, при этом будет доступно
  • автодополнение имени. Для bash нужно установить bash-completion, если он не установлен, для zsh нужно тоже активировать пакет автокомплита — вот и всё.
Вот это — единственный правильный вариант, хоть он и реализован без всяких хитрых штучек и хаков. Я уважаю право каждого опытного сисадмина на выбор того варианта решения задачи, который ему больше нравится, но так же я считаю, что для определённых задач есть определённые инструменты, игнорировать которые просто глупо. Так-то.

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

Отправить комментарий