В Ubuntu 16.04 я выполнился:
eval $(ssh-agent) && ssh-add
Я добрался:
Agent pid 3361
Я затем SSH туннелировал в свой VPS успешно после вставки моего пароля.
Ну, дело не в этом большая часть "проблемы", но:
Я вернулся к своей локальной сессии с exit
, и когда я пытался войти в свой VPS снова, я должен был повторно войти в свой пароль...
Почему меня попросили бы ввести пароль снова?
Я не закрыл текущий сеанс и сделал eval $(ssh-agent) && ssh-add
, перед туннелированием. Так, почему система не будет "помнить" это?
Каждый раз, когда вы делаете eval $(ssh-agent) && ssh-add
, запускается новый агент, поэтому вам необходимо повторно пройти аутентификацию на нем.
Я думаю, что лучший способ - это постоянно хранить данные агента SSH за сеанс (в ваших ~/.profile
):
export SSHPROC=${HOME}/.ssh/cur-proc.${HOSTNAME}
restart_ssh_agent(){
. ${SSHPROC}
kill ${SSH_AGENT_PID}
/bin/rm -rf ${SSHPROC} ${SSH_AUTH_SOCK} /tmp/ssh-*
ssh-agent > ${SSHPROC}
cat ${SSHPROC}
. ${SSHPROC}
ssh-add
}
и добавить . ${SSHPROC}
в .bashrc
.
Затем вы звоните restart_ssh_agent
один раз (или когда он по какой-то причине умирает), а затем сохраняете свои полномочия у агента.
Вам нужно к , обнаруживают, если ssh-agent
уже работает через Ваш .bashrc
. Если это не работает, то запустите его. Если это уже работает, то используйте его.
Вот отрывок от моего .bashrc
, который настраивает переменные среды для существующей сессии.
#
# setup ssh-agent
#
#start running ssh-agent if it is not already.
if [ ! 'root' = "${USER}" ]; then
if ! pgrep ssh-agent &> /dev/null && ! uname -rms | grep Darwin &> /dev/null; then
eval "$(ssh-agent -t 3600)" > /dev/null
fi
if ! uname -rms | grep Darwin &> /dev/null; then
if [ -z "${SSH_AUTH_SOCK}" -o -z "${SSH_AGENT_PID}" ]; then
#first time failed so try again.
SSH_AUTH_SOCK="$(ls -l /tmp/ssh-*/agent.* 2> /dev/null | grep "${USER}" | awk '{print $9}' | tail -n1)"
SSH_AGENT_PID="$(echo ${SSH_AUTH_SOCK} | cut -d. -f2)"
fi
if [ -z "${SSH_AUTH_SOCK}" -o -z "${SSH_AGENT_PID}" ]; then
SSH_AUTH_SOCK="$(lsof -p "$(pgrep ssh-agent | tr '\n' ',')" | grep "${USER}" | grep -e "ssh-[^/]*/agent\.[0-9]\+$" | tr ' ' '\n' | tail -n1)"
SSH_AGENT_PID="$(echo ${SSH_AUTH_SOCK} | cut -d. -f2)"
fi
fi
[ -n "${SSH_AUTH_SOCK}" ] && export SSH_AUTH_SOCK
[ -n "${SSH_AGENT_PID}" ] && export SSH_AGENT_PID
fi
я использую тот же самый отрывок для нескольких платформ и не только Mac или Linux на x86. Тот отрывок может быть далее улучшен, но на данный момент он работает на меня надежно.