Самый простой способ скопировать ключи SSH на другую машину?


342

Я ленивый дома и использую аутентификацию по паролю для моих домашних машин. Я готов перейти к аутентификации на основе ключей. В Интернете есть много вариантов того, как это сделать, в том числе перехватывать, затем перекидывать ключ, перебирать ключ напрямую и т. Д.

Я ищу самый простой и рекомендуемый способ копирования ключа, надеюсь, есть где-нибудь в пакете Ubuntu ssh вспомогательная оболочка?

Я уже в курсе, как отключить пароли логинов .


Ответы:


463

Команда ssh-copy-id(в пакете openssh-client и установлена ​​по умолчанию) делает именно это:

ssh-copy-id user@hostname.example.com

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

Идентификацией по умолчанию является ваш «стандартный» ключ ssh. Она состоит из двух файлов (открытые и закрытые ключи) в вашем ~/.sshкаталоге, как правило , с именем identity, id_rsa, id_dsa, id_ecdsaили id_ed25519(и то же самое с .pub), в зависимости от типа ключа. Если вы не создали более одного ключа ssh, вам не нужно беспокоиться об указании идентификатора, ssh-copy-id просто выберет его автоматически.

Если у вас нет идентификатора, вы можете создать его с помощью инструмента ssh-keygen.

Кроме того, если сервер использует порт, отличный от порта по умолчанию ( 22), вы должны использовать кавычки следующим образом ( источник ):

ssh-copy-id "user@hostname.example.com -p <port-number>"

1
Какая идентификация по умолчанию?
Oxwivi

17
для другого порта используйте это:ssh-copy-id "user@host -p 6842"
jibon57

5
Что, если удаленный сервер, на который вы копируете, не разрешает ввод пароля и в основном заблокирован, за исключением доступа по SSH?
Cyle

10
На Mac вы можете сделать, brew install ssh-copy-idа затем запустить команду.
Авишай

1
@MarcelStimberg, пожалуйста, обновите ответ, чтобы включить -i профиль; люди, вероятно, имеют более 1 клавиши и нажимают их всех, или им приходится искать опцию -i в комментариях
Ник

129

Мне нравится ответ от Марселя. Я не знал эту команду. Я всегда использовал то, что нашел на веб-сайте Oracle :

cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> .ssh/authorized_keys && echo "Key copied"'

Я подумал опубликовать это здесь еще, потому что это хорошая иллюстрация того, чего можно достичь в шелл-коде с помощью силы ssh. Но использование ssh-copy-idопределенно более безопасного способа сделать это правильно!

Обратите внимание, что если папка .sshеще не существует, приведенная выше команда не будет выполнена. Кроме того, может быть лучше при создании файла установить минимально возможное разрешение (в основном чтение-запись только для владельца). Вот более продвинутая команда:

cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'umask 0077; mkdir -p .ssh; cat >> .ssh/authorized_keys && echo "Key copied"'

2
Точные команды также работают с Mac
Михай П.

Это должно работать под любым Unix с большинством оболочки. Я обновил сообщение обновленной командой на тот случай, если .sshна удаленной стороне папки не существует.
Гюйгенс

1
catНе нужен - нормальный вход Перенаправление достаточно, например< ~/.ssh/id_rsa.pub | ssh ...
maxschlepzig

@Huygens Спасибо. Полезнее помнить об этом, потому что вам не нужно ничего устанавливать, и это также может быть полезно для выполнения сторонних команд, например, для изменения разрешений на стороне сервера, как вы продемонстрировали в расширенном примере.
Джонатан Комар

2
Я очень предпочитаю этот способ, так как он позволяет вам использовать подробный ssh, который помогает выяснить, почему что-то не работает. sshcopyid просто замерз и никогда не работал, все прошло отлично.
Сирены

31

Графический метод

  1. Откройте ПриложенияПароли и ключиМои личные ключи .
  2. Выберите ключ и нажмите « Удаленный» ▸ « Настроить ключ для Secure Shell» .

Настроить компьютер для подключения по SSH


В моем меню нет паролей и ключей шифрования.
Хорхе Кастро

Какой релиз Ubuntu вы используете? В Ubuntu 10.04 LTS это должно быть доступно по умолчанию.
rndrük

10.10, только что добавил тег. Ответ Марселя - то, что я ищу, хотя +1 для вашего ориентированного на рабочий стол ответа!
Хорхе Кастро

4
Эта программа есть seahorse.
Жиль

1
Я думаю, что это приложение находится в меню System-> Preferences в 10.10 (не могу проверить это прямо сейчас, я нахожусь на 10.04)
Huygens

18

В Ubuntu вы можете получить ключи с Launchpad:

ssh-import-id [launchpad account name]

Детали :

  1. Вам нужна учетная запись Launchpad, поэтому войдите или создайте учетную запись
  2. После входа нажмите кнопку рядом с ключами SSH:
  3. Вставьте содержимое файла с открытым ключом в это поле (включая комментарий). Такой ключ выглядит так:

    ssh-rsa AAAAB3Nza .... UyDOFDqJp lekensteyn
    

    Здесь ssh-rsaуказывает, что ключ является ключом RSA, AAAAB3Nza .... UyDOFDqJpявляется фактическим ключом и lekensteynявляется комментарием.

  4. Сохраните ключ, нажав Импортировать открытый ключ
  5. Если все прошло хорошо, теперь ваш ключ должен быть указан в разделе SSH-ключей:

Пакет ssh-import-idдолжен быть установлен на машине, к которой необходимо получить доступ удаленно. Этот пакет устанавливается вместе с openssh-serverпакетом, поскольку это рекомендуемый пакет для openssh-server. Убедившись, что ssh-import-idоно установлено на клиентском компьютере, запустите:

ssh-import-id [launchpad account name]

Это загрузит открытый ключ с серверов Launchpad по протоколу HTTPS, который защитит вас от MITM-атак.

В Ubuntu Lucid и ранее вы можете сделать то же самое с:

wget https://launchpad.net/~[lp acount name]/+sshkeys -O - >> ~/.ssh/authorized_keys && echo >> ~/.ssh/authorized_keys

Команда echoнужна для получения дополнительной новой строки после строки с ключом SSH.


14

для пользовательского порта

ssh-copy-id -i "user@hostname.example.com -p2222"

-i переключатель по умолчанию ~ / .ssh / id_rsa.pub, если вам нужен другой ключ, укажите путь к ключу после -i

ВНИМАНИЕ: Если вы не написали -i, он скопирует все ваши ключи, найденные в ~ / .ssh


1
Вы уверены в этом ПРЕДУПРЕЖДЕНИИ? "-i identity_file - использовать только ключи, содержащиеся в identity_file (вместо поиска идентификаторов с помощью ssh-add (1) или в файле default_ID_file). Если имя файла не заканчивается на .pub, это добавляется. Если имя файла опущен, используется default_ID_file. "
Юша Алеауб

0

ssh-copy-idделает именно это. Я не уверен, почему некоторые другие ответы здесь добавляют неточную информацию. Справка показывает следующее:

~$ ssh-copy-id -h
Usage: /usr/bin/ssh-copy-id [-h|-?|-f|-n] [-i [identity_file]] [-p port] [[-o <ssh -o options>] ...] [user@]hostname
    -f: force mode -- copy keys without trying to check if they are already installed
    -n: dry run    -- no keys are actually copied
    -h|-?: print this help

Я только что попробовал следующее на клиенте Ubuntu 18.04 с сервером CentOS 7.6, и это сработало как прелесть. В примере показано использование настраиваемого порта 2222и указание открытого ключа в~/.ssh/path-to-rsa.pub

$ ssh-copy-id -i ~/.ssh/path-to-rsa.pub -p 2222 myusername@hostname.tld

Перед выполнением команды я фактически использовал -nпереключатель в конце, чтобы выполнить пробный прогон, который подтвердил, что команда будет работать, как предполагалось. Как только я подтвердил это, я снова выполнил команду, как указано выше, без -nпереключателя.

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