Итак, я уже выяснил (и всем рассказал), что круче: alias'ы или функции, определённые в текущей интерактивной сессии командной оболочки. Кстати, рассуждения про bash-replay тоже иллюстрируют беспомощность alias'ов. Но мне не хотелось бы утверждать, что alias'ы не нужны, бесполезны, слабы в функциональном плане или что-то подобное. Как говорит один мой знакомый, «фичи всякие нужны, фичи всякие важны». Ранее я обещал вернуться к теме скриптов, с помощью которых можно легко и изящно устанавливать ssh-сессии с несколькими серверами. На этом примере я и покажу, что alias очень даже конкурентоспособен.
Полезный совет начинающему сисадмину, с которым я хотел поспорить, звучал так: создайте каталог ~/bin/, добавьте его в $PATH, напишите скрипт с таким содержанием:
Даже банальный alias srv1='ssh username@servername1' дал бы больше пользы: теперь уже вся команда укладывается в 4 символа. И можно прописывать уникальные параметры доступа для каждого сервера. Единственное, что неудобно, по сравнению с предыдущим вариантом — это создавать эти алиасы: открыть файл и вписать в него длинную строчку vs сделать симлинк на более короткую строчку. Однако тут в дело можно пустить встроенный в голову оптимизатор: выделяем файл для alias'ов, подключаем его в ~/.bashrc (командой source $SSH_ALIASES_FILE), пишем функцию:
Но кое что в этом решении мне не нравится. Дело в том, что оно тоже сделано через жопу, как и тот скрипт. Во-первых, если уж писать скрипт, который принимает в качестве параметров только своё имя, то писать его так:
Во вторых, автодополнение для аргументов команды ssh встроенными средствами есть и в bash, и в zsh. Для этого просто нужно использовать то средство, которое предназначено как раз для настройки ssh-клиента: ~/.ssh/config. Почитать про него можно man ssh_config. Этот файл позволяет:
Полезный совет начинающему сисадмину, с которым я хотел поспорить, звучал так: создайте каталог ~/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 нужно тоже активировать пакет автокомплита — вот и всё.
Комментариев нет:
Отправить комментарий