Как навсегда добавить закрытый ключ с помощью ssh-add в Ubuntu?

386

У меня есть закрытый ключ, защищенный паролем для доступа к серверу через SSH.

У меня есть 2 linux (ubuntu 10.04) машины, и поведение команды ssh-add отличается в обоих из них.

В одной машине, когда я использую "ssh-add.ssh/identity" и ввел свой пароль, ключ был добавлен постоянно, т.е. каждый раз, когда я завершаю компьютер и снова вхожу, ключ уже добавлен.

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

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

Кто-нибудь знает, как добавить его навсегда на другую машину?

  • 1
    агент должен быть только временным; но возможно у вас есть команда ssh-add где-то в ~ / .bashrc или около того на одной из обеих машин
Теги:
key
ssh
ssh-agent

13 ответов

525
Лучший ответ

Решение состоит в том, чтобы принудительно сохранить ключевые файлы, добавив их в файл ~/.ssh/config:

IdentityFile ~/.ssh/gitHubKey
IdentityFile ~/.ssh/id_rsa_buhlServer 

Чтобы это работало, в файле должен быть установлен chmod 600. Вы можете использовать команду chmod 600 config.

Если вы хотите, чтобы все пользователи компьютера использовали ключ, поместите эти строки в /etc/ssh/ssh_config а ключ в папке, доступной для всех.

Кроме того, если вы хотите установить ключ, специфичный для одного хоста, вы можете сделать следующее в вашем ~/.ssh/config:

Host github
    HostName github.com
    User git
    IdentityFile ~/.ssh/githubKey

Вам нужно будет клонировать с @github вместо @github.com, но это имеет то преимущество, что будет пробоваться только этот ключ.

  • 70
    Разрешения на файл конфигурации должны быть 600. chmod 600 config
  • 5
    Я должен вводить свой пароль для каждого нажатия, извлечения или клонирования с этим, как мне избежать этого?
Показать ещё 9 комментариев
94

Это не ответило на мою проблему в Mac OS X Lion. В итоге я добавил:

ssh-add ~/.ssh/id_rsa &>/dev/null

К моему .zshrc(но .profile тоже будет хорошо), который, похоже, исправил его.

(Как предлагается здесь: http://geek.michaelgrace.org/2011/09/permanently-add-ssh-key-ssh-add/)

  • 5
    Я думаю, что это лучше, чем предложенное мной решение, потому что ssh-add использует агент аутентификации, который может запомнить ключевую фразу защищенного закрытого ключа, поэтому вам не нужно вводить его каждый раз при попытке аутентификации. Еще одно преимущество предлагаемого вами решения заключается в том, что если у вас много ключей, клиент ssh не будет предлагать ключи, не относящиеся к серверу, к которому вы пытаетесь подключиться, на самом деле он будет предоставлять только ключи, которые предназначены для этого сервера, и выиграл ' t приводит к тому, что сервер отказывает в соединении из-за достижения MaxAuthTries, одновременно пробуя все ключи, перечисленные в ssh / config.
  • 1
    Спасибо @daminetreg. Моя конкретная проблема заключалась в том, чтобы получить доступ к Gitosis на компьютере разработчика, не передавая на него свой личный ключ. Это решение (наряду с добавлением ForwardAgent yes в мой .ssh/config ) решило эту проблему фантастически. Как оказалось, это может быть просто ssh-add &>/dev/null как стандартное поведение ssh-add заключается в добавлении ключей, которые он находит в вашей папке .ssh .
Показать ещё 2 комментария
92

Я решил эту проблему в Mac OSX (10.10), используя опцию -K для ssh-add:

ssh-add -K ~/.ssh/your_private_key

Для macOS 10.12 и более поздних версий вам необходимо дополнительно отредактировать конфигурацию ssh, как описано здесь: https://github.com/jirsbek/SSH-Keys-in-macOS-Sierra-Keychain

  • 2
    это лучший ответ для людей, которые хотят установить его навсегда
  • 0
    Это не работает на CentOS
Показать ещё 7 комментариев
30

Просто добавьте цепочку ключей, как указано в Ubuntu Quick Tips https://help.ubuntu.com/community/QuickTips

Что

Вместо постоянного запуска ssh-agent и ssh-add можно использовать keychain для управления вашими ssh-ключами. Чтобы установить keychain, вы можете просто щелкнуть здесь или использовать Synaptic для выполнения задания или apt-get из командной строки.

Командная строка

Другой способ установки файла - открыть терминал (Application- > Accessories- > Terminal) и ввести:

sudo apt-get install keychain

Редактировать файл

Затем вы должны добавить следующие строки в ваш ${HOME}/. bashrc или /etc/ bash.bashrc:

keychain id_rsa id_dsa
. ~/.keychain/`uname -n`-sh
  • 0
    Что именно делает вторая команда из любопытства? это просто открывает разрешения для текущего пользователя?
  • 0
    Это . псевдоним source
17

Я попробовал решение @Aaron, и это не совсем сработало для меня, потому что оно будет повторно добавлять мои ключи каждый раз, когда я открываю новую вкладку в моем терминале. Поэтому я немного изменил его (обратите внимание, что большинство моих ключей также защищены паролем, поэтому я не могу просто отправить вывод в /dev/null ):

added_keys=`ssh-add -l`

if [ ! $(echo $added_keys | grep -o -e my_key) ]; then
    ssh-add "$HOME/.ssh/my_key"
fi

Что это значит, так это то, что он проверяет вывод ssh-add -l (который перечисляет все добавленные ключи) для определенного ключа, и если он не находит его, он добавляет его с помощью ssh-add.

В первый раз, когда я открываю свой терминал, меня спрашивают пароли для моих закрытых ключей, и меня не спрашивают снова, пока я не перезагружу (или не выйдет из системы - я не проверил) свой компьютер.

Поскольку у меня есть куча ключей, я сохраняю вывод ssh-add -l в переменной для повышения производительности (по крайней мере, я думаю, это улучшает производительность:))

PS: Я на Linux, и этот код отправился в мой ~/.bashrc файл - если вы находитесь в Mac OS X, то я предполагаю, что вы должны добавить его в .zshrc или .profile

EDIT: Как отметил @Aaron в комментариях, файл .zshrc используется из оболочки zsh, поэтому, если вы не используете его (если вы не уверены, то, скорее всего, вы используете bash), этот код должен перейти в ваш файл .bashrc.

  • 3
    .zshrc для оболочки zsh , которую я использую вместо bash . Если вы используете bash в Mac OS X (по умолчанию), то там тоже будет .bashrc .
  • 1
    После ssh-add -l код возврата echo $? может использоваться, чтобы решить, добавлять ли ключ или нет. Я мой linux-компьютер с bash, ssh-add -l не выведет имя файла ключа. Код возврата всегда работает.
11

В моем случае решение было:

Разрешения для файла конфигурации должны быть 600. chmod 600 config

Как упоминалось в комментариях выше  generalopinion

Не нужно касаться содержимого конфигурационного файла.

  • 0
    Мне не хватило на Linux Mint 17.1.
  • 0
    Я не думаю, что 600 имеет смысл. man ssh сообщает нам, что файл ~/.ssh/config доступен для чтения и записи для пользователя и недоступен для записи другим пользователям.
Показать ещё 1 комментарий
3

В Ubuntu 14.04 (возможно, раньше, может быть, еще) вам даже не нужна консоль:

  • запустите seahorse или запустите ту вещь, которую вы найдете в поиске "ключа"
  • создайте там SSH-ключ (или импортируйте его)
    • Не нужно оставлять кодовую фразу пустой.
    • вам предлагается даже нажать открытый ключ на сервер (или более)
  • вы закончите работу с ssh-agent, и этот ключ будет загружен, но заблокирован
  • с помощью ssh будет получать идентификатор (то есть ключ) через агента
  • при первом использовании во время сеанса, кодовая фраза будет проверена
    • и у вас есть возможность автоматически разблокировать ключ при входе в систему
    • это означает, что login auth будет использоваться для обертывания ключевой фразы ключа
  • обратите внимание: если вы хотите переслать свою личность (например, переадресацию агента), вызовите ssh с помощью -A или сделайте это по умолчанию
    • иначе вы не сможете аутентифицироваться с помощью этого ключа на машине, на которую вы входите позднее, на третью машину.
2

У меня была такая же проблема в Ubuntu 16.04: некоторые ключи были добавлены навсегда, для других мне приходилось выполнять ssh-add при каждом сеансе. Я обнаружил, что ключи, которые были добавлены постоянно, имели закрытый и открытый ключи, находящиеся в ~/.ssh а ключи, которые были забыты при каждом сеансе, имели только закрытые ключи в ~/.ssh dir. Так Решение простое: вы должны скопировать как частный и публичный ключ ~/.ssh перед выполнением ssh-add.

  • 1
    Недооцененный ответ. Это решило мою проблему без необходимости дополнительных скриптов или пакетов после поиска в течение двух часов.
2

Это сработало для меня.

ssh-agent /bin/sh
ssh-add /path/to/your/key
2

очень простой ^ _ ^ два шага

1.yum install keychain

Код 2.add ниже .bash_profile

/usr/bin/keychain $HOME/.ssh/id_dsa
source $HOME/.keychain/$HOSTNAME-sh
  • 9
    Ubuntu не имеет ням глупости;)
2

Добавление следующих строк в "~/.bashrc" решило проблему для меня. Я использую рабочий стол Ubuntu 14.04.

eval `gnome-keyring-daemon --start`
USERNAME="reynold"
export SSH_AUTH_SOCK="$(ls /run/user/$(id -u $USERNAME)/keyring*/ssh|head -1)"
export SSH_AGENT_PID="$(pgrep gnome-keyring)"
1

Для тех, кто использует оболочку Fish, вы можете использовать следующую функцию, затем вызвать ее в ~/.config/fish/config.fish. Он загрузит все ключи, которые начинаются с id_rsa, в ssh-agent.

# Load all ssh keys that start with "id_rsa"
function loadsshkeys
  set added_keys (ssh-add -l)
   for key in (find ~/.ssh/ -not -name "*.pub" -a -iname "id_rsa*")
    if test ! (echo $added_keys | grep -o -e $key)
      ssh-add "$key"
    end
  end
end

# Call the function to run it.
loadsshkeys

Если вы хотите, чтобы ssh-agent запускался автоматически при открытии терминала, вы можете использовать tuvistavie/fish-ssh-agent для этого.

1

Я запускаю Ubuntu, используя два ключа id_rsa. (один личный для работы). ssh-add будет помнить один ключ (личный) и каждый раз забывать о компании.

Проверяя разницу между двумя, я видел, что у моего личного ключа было 400 прав, в то время как у компании было 600 прав. (имел u + w). Удаление права на запись пользователя из ключа компании (u-w или set to 400) устранило мою проблему. ssh-add теперь запоминает оба ключа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню