вторник, 5 марта 2013 г.

ssh-agent + ssh-add: вводим пароль к ssh-ключам один раз за сессию

Как и многие другие юзвери, я достаточно ленив для того, чтобы при каждом чихе вводить пароли. Особенно если приходится по сто раз за сеанс подключаться к серверам по SSH - это, мягко говоря, утомляет.
Технология добавления ключей в агента уже рассмотрена вдоль и поперек в сотне различных документов, но почти все они не устраивали меня: мне лень вводить пароль к ключам при входе в сеанс - если запускать ssh-add автоматически, или не забыть запустить его при первой попытке входа по ssh, чтобы потом об этом не задумываться...

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

Пишем вот такой скриптик:

#!/bin/sh

if [ "x$1" == "x" ] ; then
    echo Usage: ssh.sh HOST
    exit 1
fi
ssh-add -l > /dev/null
if [ $? -eq 1 ]  ; then
    ssh-add
    if [ $? -eq 1 ]  ; then
        exit 2
    fi
fi
/usr/bin/ssh $1

Пояснять в деталях, что и откуда взялось, сейчас некогда, так что если будут вопросы - в каменты, по возможности отвечу.

Далее, этот скрипт под именем ssh.sh я сохранил в папке ~/.ssh (не забыв дать ему права на запуск), а потом создал алиас для его запуска:

# добавил следующую строку в ~/.bashrc
alias ssh='$HOME/.ssh/ssh.sh'

Что мы теперь имеем? При попытке обычного вызова ssh myhost.com (вход в который реализован по пабик ключу) произойдет проверка принципиального наличия ключей в агенте. Если ключи еще не были подгружены, код завершения будет равен 1. В этом случае добавляем ключи в агент. При ошибке в пароле код завершения также будет равен 1, что позволяет завершить скрипт без головной боли. Если же все в порядке - ключи преспокойно добавляются в агент, после чего благополучно запускается ssh с указанием выбранного хоста.

Можно было выводить какое-нибудь осмысленное сообщение об ошибке, но мне это показалось излишним. Также я не реализовывал передачу дополнительных ключей в ssh, но для моих целей в этом нет необходимости. В любом случае, этот вариант решения задачи наверняка можно расширить под Ваши нужды.

That's all, folks!

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

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