Як назавжди додати приватний ключ з ssh-add на Ubuntu? [зачинено]


474

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

У мене є 2 машини Linux (ubuntu 10.04), і поведінка команди ssh-add відрізняється в обох.

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

В іншому я маю додавати ключ щоразу, коли я входив.

Наскільки я пам’ятаю, я робив те саме і на обох. Єдина відмінність полягає в тому, що ключ був створений на тому, який додається постійно.

Хтось знає, як його постійно додати до іншої машини?


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

Відповіді:


632

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

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

Якщо у каталозі ~ / .ssh у вас немає файлу "config", вам слід створити його. Він не потребує кореневих прав, тому просто:

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, він запам'ятає вашу ключову фразу. Я запропонував рішення: встановити його постійно через перезавантаження.
daminetreg

28
Ця відповідь настільки хороша, що ssh-add не повинен існувати. Хто хоче мати команду, яка "тимчасово" виправляє проблему і несподівано зривається, коли ви можете просто редагувати конфігураційний файл назавжди.
RussellStewart

2
Проблема полягає в такому конфігурації, якщо ви цього не зробите в .ssh / config для конкретного хоста, ви кожен раз будете намагатися перевіряти всі ключі проти всіх серверів.
daminetreg

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, які графічні інтерфейси OS X використовують для аутентифікації на іноземних серверах. Плакат у цьому Q з'єднується через тунель SSH, але все ще просто підключається до віддаленого сервера. A - [Тунель SSH] -> B У випадку, в якому я перебуваю, я перебуваю на віддаленому сервері, але хочу, щоб автентифікація була проти облікових даних моєї домашньої системи. A <- [Auth] - B - [Connect] -> C -KНасправді це не допомагає, але є чудовим рішенням для іншого Q.
Aaron

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)
guptron

2
Згідно man ssh-addз macOS High Sierra, ssh-add -Kзбереже парольну фразу в брелок, а після перезавантаження просто скористайтеся ssh-add -A, для чого не потрібно вводити парольну фразу.
DawnSong

36

Просто додайте брелок, на який посилається в Ubuntu Quick Tips https://help.ubuntu.com/community/QuickTips

Що

Замість того, щоб постійно запускати ssh-агент і ssh-add, можна використовувати брелок для управління вашими ключами ssh. Щоб встановити брелок, ви можете просто натиснути тут або використати Synaptic, щоб виконати роботу або вдало отримати з командного рядка.

Командний рядок

Ще один спосіб встановлення файлу - відкрити термінал (Application-> Accessories-> Terminal) і ввести:

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

EDIT: Як вказував @Aaron у коментарях, .zshrcфайл використовується з zshоболонки - тому якщо ви не використовуєте це (якщо ви не впевнені, то, швидше за все, ви використовуєте bashзамість цього), цей код повинен перейдіть до свого .bashrcфайлу.


3
.zshrcпризначений для zshоболонки, яку я використовую замість bash. Якщо ви використовуєте bashMac OS X (за замовчуванням), він також буде .bashrcтам.
Аарон

1
Після ssh-add -lповернення код echo $?можна використовувати, щоб вирішити, додавати ключ чи ні. Я мій Linux машина з bash, ssh-add -lне виведе ключове ім'я файлу. Код повернення завжди працює.
Бхарат G

12

У моєму випадку рішення було:

Дозволи на конфігураційний файл мають бути 600. chmod 600 config

Як згадується в коментарях вище від generalopinion

Не потрібно торкатися вмісту конфігураційного файлу.


Мені було недостатньо для Linux Mint 17.1.
Бенарес

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

600 читається та пише лише для користувача
Ентузіазм

6

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

PS: Наскільки я розумію з вікі Gnome, мій метод працює завдяки інструменту для ключів gnome, який є частиною середовища Gnome Desktop. Тому мій метод, ймовірно, повинен працювати лише в тому випадку, якщо ви використовуєте DE на основі Gnome або Gnome.


1
Занижена відповідь. Це вирішило мою проблему, не потребуючи додаткових скриптів чи пакунків після пошуку протягом двох годин.
etagenklo

Фларкін казковий! Чудова детективна робота. Я не думаю, що я б це зрозумів.
nicorellius

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буде підбирати ідентифікатор (тобто ключ) через агент
  • при першому використанні під час сеансу пароль перевірятиметься
    • і у вас є можливість автоматично розблокувати ключ при вході в систему
    • це означає, що автентифікація для входу буде використана для обгортання парольної фрази ключа
  • Примітка: якщо ви хочете , щоб направити вашу особистість (тобто агент пересилки) Invoke ваш sshз -Aабо зробити що за замовчуванням
    • в іншому випадку ви не можете автентифікувати цей ключ на машині, до якої ви ввійдете пізніше на третю машину

3

Я запускаю Ubuntu за допомогою двох ключів id_rsa. (одна особиста для роботи). ssh-add запам'ятає один ключ (особистий) і забуде про компанію кожного разу.

Перевіряючи різницю між двома, я бачив, що мій особистий ключ мав 400 прав, а компанія одна - 600 прав. (мав u + w). Видалення запису користувача прямо з ключа компанії (uw або встановленого на 400) вирішило мою проблему. ssh-add тепер запам'ятовує обидві клавіші.



1

дуже простий ^ _ ^ два кроки

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

2.додайте код нижче до .bash_profile

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

12
У Ubuntu немає ні дурного;)
Адам Ф

1

Для тих , які використовують молюск Ви можете використати таку функцію потім викликати його в ~/.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.