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


474

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

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

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

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

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

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


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

Ответы:


632

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

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

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

nano ~/.ssh/config

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

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

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

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

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

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


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

6
Я должен вводить свой пароль для каждого нажатия, выборки или клонирования с этим, как мне избежать этого?
— Асаф

9
Используйте вместо этого ssh-add ~/.ssh/gitHubKey, он запомнит вашу ключевую фразу-пароль. Решение, которое я предложил, состояло в том, чтобы установить его постоянно при перезагрузках.
— Даминетрег

28
Этот ответ настолько хорош, что ssh-add не должен существовать. Кто хочет иметь команду, которая «временно» решает проблему и неожиданно ломается, когда вы можете просто редактировать файл конфигурации навсегда.
— RussellStewart

2
Проблема в этом типе конфигурации, если вы не сделаете это в .ssh / config для определенного хоста, вы будете каждый раз пытаться использовать все ключи на всех серверах.
— Даминетрег

118

Это не отвечало на ту же проблему для меня под 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/ )


6
Я думаю, что это лучше, чем предложенное мной решение, потому что ssh-add использует агент аутентификации, который может запомнить ключевую фразу защищенного закрытого ключа, поэтому вам не нужно вводить его каждый раз при попытке аутентификации. Другое преимущество предлагаемого вами решения заключается в том, что если у вас много ключей, клиент ssh не будет предлагать ключи, не относящиеся к серверу, к которому вы пытаетесь подключиться, на самом деле он будет предоставлять только те ключи, которые предназначены для этого сервера, и выиграл ' t приводит к тому, что сервер отказывает в соединении из-за достижения MaxAuthTries, одновременно пробуя все ключи, перечисленные в ssh / config.
— daminetreg

1
Спасибо @daminetreg. Моя конкретная проблема заключалась в том, чтобы получить доступ к Gitosis на компьютере разработчика, не передавая на него свой закрытый ключ. Это решение (наряду с добавлением ForwardAgent yesк моему .ssh/config) решило эту проблему фантастически. Как оказалось, это может быть просто ssh-add &>/dev/nullповедение по умолчанию ssh-addдля добавления ключей, которые он находит в вашей .sshпапке.
— Аарон

1
Насколько я понимаю, в Mac OS есть ключ -K: stackoverflow.com/questions/1909651/…
— Нику Тофан,

3
@TNick -Kдобавляет ключи в цепочку ключей OS X, которые используются в GUI OS X для аутентификации на сторонних серверах. Постер в том Q соединяется через SSH Tunnel, но все еще только соединяется с удаленным сервером. A - [SSH Tunnel] -> B Дело в том, что я нахожусь на удаленном сервере, но хочу, чтобы проверка подлинности проводилась против учетных данных в моей домашней системе. A <- [Auth] - B - [Connect] -> C Так -Kчто на самом деле не помогает, но является отличным решением для другой Q.
— Аарон

112

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


3
это лучший ответ для людей, которые хотят установить его постоянно
— punkrockpolly

12
Отсюда и этот бит: «на Mac OSX (10.10)» ...
— Эндрю К.

1
Это хорошо и работает на Mac OSX, но не работает на Ubuntu (14.04 в моем тестировании).
— haxpor

5
Это не сработало для меня (на OSX 10.12.4)
— Гуптрон

2
Согласно man ssh-addMacOS High Sierra, ssh-add -Kсохранит ключевую фразу в цепочку для ключей, а после перезагрузки просто используйте ssh-add -A, для которой вам не нужно вводить вашу ключевую фразу.
— DawnSong

36

Просто добавьте цепочку для ключей, как указано в Ubuntu Quick Tips 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

Что именно делает вторая команда из любопытства? это просто открывает разрешения для текущего пользователя?
— Винсент Бускарелло

1
Это .псевдоним дляsource
— Брэд Соломон

18

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


3
.zshrcдля zshоболочки, которую я использую вместо bash. Если вы используете bashв Mac OS X (по умолчанию), он также будет .bashrcтам.
— Аарон

1
После ssh-add -lкода возврата echo $?можно использовать, чтобы решить, добавлять ли ключ или нет. Я мой Linux-компьютер с Bash, ssh-add -lне будет выводить имя файла ключа. Код возврата всегда работает.
— Бхарат G

12

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

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

Как упомянуто в комментариях выше по genralopinion

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


Мне не хватило на Linux Mint 17.1.
— Бенарес

Я не думаю, что 600 имеет смысл. man ssh сообщает нам, что ~/.ssh/configфайл предназначен для чтения / записи для пользователя и недоступен для записи другими.
— DawnSong

600 для чтения и записи только для пользователя
— Enthusiasmus

6

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

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


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

Фларкин сказочный! Отличная детективная работа. Я не думаю, что я бы понял это.
— Никорелий

4

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

3

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

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

3

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

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



1

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

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

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

/usr/bin/keychain $HOME/.ssh/id_dsa
source $HOME/.keychain/$HOSTNAME-sh

12
Ubuntu не имеет глупости ням;)
— Адам Ф

1

Для тех, кто использует оболочку 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запустить авто при открытии терминала, вы можете использовать tuvistavie / fish-ssh-agent для этого.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.