Чому ssh-agent не збереже мій незашифрований ключ для подальшого використання?


12

Кожен раз, коли я перебуваю на іншому сервері з нашого безголового сервера 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

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 чудово підходить для роботи sshз іншими машинами. Але це не відбувається при gitнатисканні або перетягуванні на загальнодоступне сховище. Чи є у вас ідеї, як я міг би це вирішити?
Treffynnon

Додайте функцію, ідентичну ssh(), викличте її git()та змініть останній рядок з /usr/bin/sshна /usr/bin/git. Також додайте заключний рядок із export -f git.
enzotib

@enzotib Я спробував це, але тепер, коли я зайшов sshу машину з bash_profileфайлом, який ви створили вище налаштування, він запитує у мене пароль ключа. Чомусь зараз кожен раз, коли я сш в ньому запитує, ще до того, як я страчую sshабо git. Див. Gist.github.com/942082 для підказки, яку я повертаю, коли я входжу в автомат, що порушує право.
Треффіннон

@Treffynnon: Я не знаю, як саме gitвзаємодіяти ssh, і не використовую, gitщоб не міг спробувати. Я змінив функцію, ~/.bash_profileщоб включити git()функцію, про яку я згадував вище, щоб переконатися, що попереднє пояснення було зрозумілим. Також з результату видно, що ви показуєте, що ви змінили серверну машину, але всі мої поради були спрямовані лише на клієнтську машину.
enzotib

@enzotib Це правильно. Сервер, на який я входжу, стає моїм клієнтом, коли я переходимо gitдо центральної кузні / сховища з нього, щоб файл знаходився в потрібному місці. Я думаю, ти щойно дав мені підказку / пробіг мої думки. У мене є спеціальний підказчик bash, який відображає гітку git pwd. Б'юсь об заклад, що саме це викликає запит на пароль при входженні в bash, оскільки він намагається отримати git stat перед наданням bash-підказки!
Treffynnon

2

Нещодавно я почав використовувати ssh-ident:

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.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.