Статья в Википедии, вероятно, имеет лучшее описание:
Проверка на сервере основана на аутентификации запрос-ответ. ssh подключается к серверу с именем пользователя и запросом ключа. Демон ssh получает запрос и отправляет обратно запрос на основе открытого ключа, хранящегося в файле аутентификации. ssh использует закрытый ключ для создания ответа ключа и отправляет его ожидающему sshd на другом конце соединения. Сам секретный ключ не отправляет. Демон ssh проверяет ответ ключа и, если он действителен, предоставляет доступ к системе. ssh-agent упрощает это, создавая сокет, который прослушивает SSH-соединения. Пользователь просто запускает ssh-agent, сообщая ему, как найти свои ключи (если они не находятся в расположении по умолчанию), вводит ключевую фразу для каждого используемого ключа, единовременно,
Опять дословно из статьи в википедии:
... ssh-agent создает сокет и затем проверяет соединения из ssh. Каждый, кто может подключиться к этому сокету, также имеет доступ к ssh-агенту. Права доступа установлены как в обычной системе Linux или Unix. Когда агент запускается, он создает новый каталог в / tmp с ограниченными правами. Гнездо находится в папке.
Обычно он помещается в системные или пользовательские rc-файлы, такие как $HOME/.bashrc
или $HOME/.profile
(для оболочек bash), так что ssh-agent
набор переменных среды полностью включается в вашу среду.
В моей системе Fedora 14 она запускается довольно рано как часть подсистемы X11. В этом файле /etc/X11/xinit/xinitrc-common
:
# Prefix launch of session with ssh-agent if available and not already running.
SSH_AGENT=
if [ -z "$SSH_AGENT_PID" ] && [ -x /usr/bin/ssh-agent ]; then
if [ "x$TMPDIR" != "x" ]; then
SSH_AGENT="/usr/bin/ssh-agent /bin/env TMPDIR=$TMPDIR"
else
SSH_AGENT="/usr/bin/ssh-agent"
fi
fi
Затем переменная $SSH_AGENT
используется в других сценариях запуска X11, таких как здесь /etc/X11/xinit/Xclients
:
exec -l $SHELL -c "$SSH_AGENT $XCLIENTS_D/Xclients.$1.sh"
При включении этого здесь следующие переменные среды устанавливаются как часть родительской оболочки, поэтому они должны быть у всех разветвленных потомков, например:
SSH_AUTH_SOCK=/tmp/ssh-PspRF18958/agent.18958; export SSH_AUTH_SOCK;
SSH_AGENT_PID=18959; export SSH_AGENT_PID;
Это немного сложнее, но в двух словах, это в основном то, что происходит ssh-agent
.
Например, в GNOME ssh-agent
фактически запускается для каждого пользователя в качестве запускаемого приложения:
TL; DR
Суть в том, ssh-agent
что когда вам нужны ssh-ключи, вам нужно всего лишь один раз разблокировать их парольной фразой (при условии, что она есть), и с тех пор они доступны в расшифрованном виде в памяти (RAM).