Самый простой способ скопировать ключи 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

ændrük
источник
В моем меню нет паролей и ключей шифрования.
Хорхе Кастро
Какой релиз 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.

Lekensteyn
источник
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переключателя.

isapir
источник