Почему ssh-agent не сохраняет мой незашифрованный ключ для последующего использования?

12

Каждый раз, когда я отправляю SSH на другой сервер с нашего безголового сервера Ubuntu, меня просят ввести пароль для моего файла ключей. Даже если я ранее подключился к серверу.

У вас есть идеи, почему это возможно? Это может быть что-то столь же простое, как в ssh-agentданный момент, или что-то еще

Тот же ключ на моем рабочем столе Ubuntu Gnome работает нормально. И сервер, и рабочий стол работают под управлением Ubuntu 10.10.

ps -ef | grep '[s]sh-agent'
simon     3219     1  0 12:46 ?        00:00:00 ssh-agent
Treffynnon
источник
1
Сначала, как вы сказали, проверьте, ssh-agentработает ли :ps -ef | grep '[s]sh-agent'
Скотт Северанс
@mssever Да, похоже. Смотрите обновленный вопрос.
Треффиннон

Ответы:

10

Даже если агент включен, если определенные переменные среды не установлены, у вас нет ссылки на агента. Более того, даже если все в порядке, агент и переменные, удостоверение не отправляется автоматически агенту: это задача ssh-askpass, работающая только в сеансах X.

Если вы используете bash, создайте файл ~/.bash_profileсо следующим содержимым:

# File: ~/.bash_profile

# source ~/.profile, if available
if [[ -r ~/.profile ]]; then
  . ~/.profile
fi

# start agent and set environment variables, if needed
agent_started=0
if ! env | grep -q SSH_AGENT_PID >/dev/null; then
  echo "Starting ssh agent"
  eval $(ssh-agent -s)
  agent_started=1
fi

# ssh become a function, adding identity to agent when needed
ssh() {
  if ! ssh-add -l >/dev/null 2>&-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/ssh "$@"
}
export -f ssh

# another example: git
git() {
  if ! ssh-add -l >/dev/null 2>&-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/git "$@"
}
export -f git

измените имя файла в ~/.ssh/id_dsaсоответствии с вашими потребностями и добавьте эту строку в~/.bash_logout

# stuff to add at end of ~/.bash_logout
if ((agent_started)); then
  echo "Killing ssh agent"
  ssh-agent -k
fi

Последнее замечание: это не мешает сеансу gnome, потому что в этом случае только ~/.profileисточник, и вы можете воспользоваться ssh-askpassграфическим интерфейсом, который запрашивает фразу-пароль и отправляет ее в ssh-agent.

enzotib
источник
Спасибо @enzotib, он отлично работает для sshдругих машин. Но это не так, когда вы используете gitpush или pull для публичного хранилища. У вас есть идеи, как я мог бы это решить?
Треффиннон
Добавьте функцию, идентичную ssh(), вызовите ее git()и измените последнюю строку с /usr/bin/sshна /usr/bin/git. Кроме того, добавьте последнюю строку с export -f git.
энзотиб
@enzotib Я попробовал это, но теперь, когда я вхожу sshв машину с bash_profileфайлом, который вы создали выше, он спрашивает у меня пароль ключа. По какой-то причине теперь каждый раз, когда я ssh в нем спрашивает еще до того, как я выполнил sshили git. Обратитесь к gist.github.com/942082 за подсказкой, которую я получаю при входе в систему на компьютере-нарушителе.
Треффиннон
@Treffynnon: я не знаю точно, как gitвзаимодействовать ssh, и я не использую, gitпоэтому я не могу попробовать. Я изменил, ~/.bash_profileчтобы включить git()функцию, которую я упомянул выше, чтобы убедиться, что мое предыдущее объяснение было ясно. Также из результатов, которые вы показываете, видно, что вы модифицировали серверную машину, но все мои советы были направлены только на клиентскую машину.
энзотиб
@enzotib Это правильно. Сервер, на котором я вхожу, становится моим клиентом, когда я gitотправляю из него центральную кузницу / репозиторий, чтобы файл находился в нужном месте. Я думаю, что вы только что дали мне подсказку / пробежали мои мысли. У меня есть специальное приглашение bash, которое отображает ветку git pwd. Могу поспорить, что именно это вызывает запрос пароля при входе в bash, поскольку он пытается просмотреть статистику перед отображением приглашения bash!
Треффиннон
2

Я недавно начал использовать ssh-идент:

https://github.com/ccontavalli/ssh-ident

все, что вам нужно сделать, это добавить что-то вроде:

alias ssh="/path/to/ssh-ident"

в вашем .bashrc. Кроме того, вы можете ln -s /path/to/ssh-ident ~/bin/sshили какой-либо другой каталог в вашем PATH до /binи /usr/bin.

rabexc
источник