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

474

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

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

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

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

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

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

duduklein
источник
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

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

daminetreg
источник
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

Totas
источник
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

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

erezmta
источник
Мне не хватило на 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.

NShiny
источник
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)"
reynoldpj
источник
3

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

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

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

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

Fholst
источник
2

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

ssh-agent /bin/sh
ssh-add /path/to/your/key
Джасим Аббас
источник
1

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

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

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

/usr/bin/keychain $HOME/.ssh/id_dsa
source $HOME/.keychain/$HOSTNAME-sh
LawrenceLi
источник
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 для этого.

frederickjh
источник