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

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

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

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

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

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

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


person duduklein    schedule 12.08.2010    source источник
comment
агент должен быть только временным; но возможно, у вас есть команда ssh-add где-то в ~/.bashrc или около того на одной из обеих машин   -  person mirek    schedule 25.10.2018


Ответы (13)


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

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

Если у вас нет файла конфигурации в каталоге ~/.ssh, вам следует его создать. Для этого не нужны рут права, поэтому просто:

nano ~/.ssh/config

... и введите строки выше в соответствии с вашими требованиями.

Для этого файл должен иметь chmod 600. Вы можете использовать команду chmod 600 ~/.ssh/config.

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

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

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

Это имеет то преимущество, когда у вас много удостоверений, и сервер не отклоняет вас, потому что вы сначала попробовали неправильные удостоверения. Будет опробована только конкретная личность.

person daminetreg    schedule 22.11.2010
comment
Права доступа к конфигурационному файлу должны быть 600. chmod 600 config - person generalopinion; 01.05.2014
comment
Я должен вводить свой пароль для каждого нажатия, извлечения или клонирования с этим, как мне этого избежать? - person Asaf; 10.07.2014
comment
Вместо этого используйте ssh-add ~/.ssh/gitHubKey, он запомнит вашу кодовую фразу. Решение, которое я предложил, состояло в том, чтобы установить его постоянно при перезагрузке. - person daminetreg; 10.07.2014
comment
Этот ответ настолько хорош, что ssh-add не должно существовать. Кто хочет иметь команду, которая временно устраняет проблему и неожиданно ломается, когда вы можете просто постоянно редактировать файл конфигурации. - person RussellStewart; 18.08.2014
comment
Проблема с такой конфигурацией, если вы не сделаете это в .ssh/config для определенного хоста, вы каждый раз будете проверять все ключи на всех серверах. - person daminetreg; 19.08.2014
comment
Это решение не использует ssh-агент. - Есть ли разница? Да, вы не можете перенаправить их личность через переадресацию агента. - person Robert Siemer; 06.11.2014
comment
@daminetreg Как он узнает, какой ключ отправить на какой сервер? Например, если у меня есть key1‹›server1 и key2‹›server2, и оба они установлены в ~/.ssh/config.. будет ли он пробовать оба ключа при подключении? Если да, то разве это не проблема безопасности? - person MZHm; 26.07.2016
comment
Как упоминалось в ответе, если вы используете второй способ, зависящий от хоста, ключ не будет проверяться на других хостах, кроме того, который указан с помощью HostName. Но с первым предложенным решением ключ будет опробован на каждом хосте. Но это не проблема, так как ключ используется для шифрования случайного сообщения запроса с сервера, и если сервер сможет расшифровать его с помощью ранее загруженного открытого ключа, то он позволит вам войти в систему. Так что злоумышленник может сделать атаки с использованием обычного текста на ваш ключ, вам следует много логинов на другие серверы, чтобы они могли начать генерировать ваш ключ. - person daminetreg; 08.08.2016
comment
Вы можете клонировать с помощью @github.com, если вы поместите это в свой файл конфигурации: Host github.com - person timblack1; 22.12.2017
comment
это работало и на mac os sierra - person user1735921; 29.10.2018
comment
Если изменение файла конфигурации запускает Host github.com, то вам не нужна строка HostName, и вам больше не нужно клонировать, используя только github, вы можете использовать обычный URL-адрес клонирования, включая github, com. - person Jonathan Hartley; 30.05.2019
comment
Спасибо @JonathanHartley, это всегда работало или это улучшение современных версий ssh? - person daminetreg; 04.06.2019
comment
Привет. Я не знаю. - person Jonathan Hartley; 04.06.2019

Это не помогло мне решить ту же проблему в 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/ )

person Aaron    schedule 06.08.2012
comment
Я думаю, что это лучше, чем предложенное мной решение, потому что ssh-add использует агент аутентификации, который может запомнить парольную фразу защищенного закрытого ключа, поэтому вам не нужно вводить ее каждый раз, когда вы пытаетесь пройти аутентификацию. Еще одно преимущество предлагаемого вами решения заключается в том, что если у вас много ключей, ssh-клиент не будет предлагать ключи, не относящиеся к серверу, к которому вы пытаетесь подключиться, на самом деле он предоставит только те ключи, которые предназначены для этого сервера, и выиграет. t приведет к тому, что сервер откажет в соединении из-за достижения MaxAuthTries при попытке использовать все ключи, перечисленные в ssh/config. - person daminetreg; 24.08.2012
comment
Спасибо @daminetreg. Моя конкретная проблема заключалась в том, чтобы получить доступ к gitosis на машине разработки без передачи на нее моего закрытого ключа. Это решение (наряду с добавлением ForwardAgent yes к моему .ssh/config) фантастически решило эту проблему. Как оказалось, это может быть просто ssh-add &>/dev/null, поскольку поведение ssh-add по умолчанию заключается в добавлении ключей, которые он находит в вашей папке .ssh. - person Aaron; 24.08.2012
comment
Насколько я понимаю, в Mac OS есть переключатель -K: stackoverflow.com/questions/1909651/ - person Nicu Tofan; 12.06.2014
comment
@TNick -K добавляет ключи в цепочку ключей OS X, которые графические интерфейсы OS X используют для аутентификации на внешних серверах. Плакат в этом вопросе подключается через туннель SSH, но по-прежнему просто подключается к удаленному серверу. A-[SSH Tunnel]-›B Дело в том, что я нахожусь на удаленном сервере, но хочу, чтобы аутентификация выполнялась по учетным данным в моей домашней системе. A ‹-[Auth]-B-[Connect]-›C Таким образом, -K на самом деле не помогает, но является отличным решением для другого Q. - person Aaron; 12.06.2014

Я решил эту проблему в 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

person totas    schedule 20.01.2015
comment
это лучший ответ для людей, которые хотят установить его навсегда - person punkrockpolly; 24.02.2016
comment
Это не работает на CentOS - person deepdive; 05.07.2016
comment
Отсюда этот бит: на Mac OSX (10.10)... - person Andrew K.; 11.11.2016
comment
Это хорошо и работает на Mac OSX, но не работает на Ubuntu (14.04 в моем тестировании). - person haxpor; 20.12.2016
comment
У меня это не сработало (на OSX 10.12.4) - person abc123; 11.04.2017
comment
Для меня это работает только в том случае, если процесс ssh-agent не был остановлен ни вручную, ни после перезагрузки. - person MarcusJ; 13.05.2018
comment
Согласно man ssh-add в macOS High Sierra, ssh-add -K сохранит кодовую фразу в цепочке для ключей, а после перезагрузки просто используйте ssh-add -A, для чего вам не нужно вводить парольную фразу. - person DawnSong; 07.06.2018
comment
OP специально попросил помощи в Ubuntu, которая была похоронена в этом сообщении. Было бы педантично просить, чтобы это было перенесено в конкретную ветку Mac? [это стоит дополнительно? :*)] - person Vincent Buscarello; 24.10.2018
comment
В более новых версиях MacOS ›10.12 в вашем файле ~/.ssh/config добавьте следующий AddKeysToAgent yes UseKeychain yes Это отлично работает в Мохаве - person athulpraj; 14.11.2018

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

Что

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

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

Другой способ установить файл — открыть терминал (Приложение->Стандартные->Терминал) и ввести:

sudo apt-get install keychain

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

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

keychain id_rsa id_dsa
. ~/.keychain/`uname -n`-sh
person Christian Saiki    schedule 16.05.2016
comment
Что именно делает вторая команда, из любопытства? это просто открывает разрешения для текущего пользователя? - person Vincent Buscarello; 24.10.2018
comment
Этот . является псевдонимом для source - person Brad Solomon; 25.01.2019
comment
Шагов достаточно? Почему файл ~/.keychain/uname -n-sh существует? - person Victor Choy; 05.06.2021

Я попробовал решение @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.

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

person Nikola Ivanov Nikolov    schedule 08.03.2014
comment
.zshrc для оболочки zsh, которую я использую вместо bash. Если вы используете bash в Mac OS X (по умолчанию), там также будет .bashrc. - person Aaron; 28.05.2014
comment
После ssh-add -l можно использовать код возврата echo $?, чтобы решить, добавлять ключ или нет. У меня Linux-машина с bash, ssh-add -l не выводит имя файла ключа. Код возврата работает всегда. - person Bharat G; 17.11.2015

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

Права доступа к конфигурационному файлу должны быть 600. chmod 600 config

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

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

person erezmta    schedule 19.05.2014
comment
Мне не хватило Linux Mint 17.1. - person Benares; 09.05.2018
comment
Я не думаю, что 600 имеет смысл. man ssh сообщает нам, что файл ~/.ssh/config доступен для чтения/записи для пользователя и не доступен для записи другими. - person DawnSong; 07.06.2018
comment
600 читается и записывается только для пользователя - person Enthusiasmus; 16.03.2019

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

PS: насколько я понял из вики Gnome, мой метод работает благодаря инструменту gnome-keyring, который является частью среды рабочего стола Gnome. Поэтому мой метод, вероятно, должен работать, только если вы используете Gnome или DE на основе Gnome.

person NShiny    schedule 10.07.2018
comment
Недооцененный ответ. Это решило мою проблему без дополнительных скриптов или пакетов после двухчасового поиска. - person etagenklo; 16.01.2019
comment
Фларкин великолепен! Отличная детективная работа. Я не думаю, что я бы понял это. - person nicorellius; 20.09.2019
comment
Для меня это тоже было решением! Вам не нужно никакого другого программного обеспечения или установки или конфигурации. Просто вставьте оба ключа. - person Andreas; 28.12.2020

Добавление следующих строк в «~/.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)"
person reynoldpj    schedule 13.05.2015

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

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

person Fholst    schedule 24.01.2017

В Ubuntu 14.04 (может раньше, а может и сейчас) вам даже не нужна консоль:

  • запустите seahorse или запустите ту вещь, которую вы найдете, ища «ключ»
  • create an SSH key there (or import one)
    • no need to leave the passphrase empty
    • вам предлагается даже отправить открытый ключ на сервер (или больше)
  • вы закончите с запущенным ssh-агентом, и этот ключ загружен, но заблокирован
  • использование ssh заберет идентификатор (т.е. ключ) через агента
  • on first use during the session, the passphrase will be checked
    • and you have the option to automatically unlock the key on login
    • это означает, что аутентификация входа будет использоваться для переноса парольной фразы ключа
  • note: if you want to forward your identity (i.e. agent-forwarding) invoke your ssh with -A or make that the default
    • otherwise you can't authenticate with that key on a machine you login to later to a third machine
person Robert Siemer    schedule 06.11.2014

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

ssh-agent /bin/sh
ssh-add /path/to/your/key
person Jaseem Abbas    schedule 02.04.2017

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

1.yum установить брелок

2.добавьте код ниже в .bash_profile

/usr/bin/keychain $HOME/.ssh/id_dsa
source $HOME/.keychain/$HOSTNAME-sh
person LawrenceLi    schedule 03.02.2016
comment
В Ubuntu нет вкусняшки, глупышка ;) - person Adam F; 29.07.2016

Для тех, кто использует оболочку Fish, вы можете использовать следующую функцию, а затем вызвать ее в ~/.config/fish/config.fish или в отдельном файле конфигурации в ~/.config/fish/conf.d/loadsshkeys.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 запускался автоматически при открытии терминала, вы можете использовать danhper/fish-ssh -agent для этого.

person frederickjh    schedule 26.12.2017