Как скопировать открытый ключ на ssh-сервер?

33

Вот что я попробовал, и я получил ошибку:

$ cat /home/tim/.ssh/id_rsa.pub | ssh tim@just.some.other.server 'cat >> .ssh/authorized_keys'
Password: 
cat: >>: No such file or directory
cat: .ssh/authorized_keys: No such file or directory
Тим
источник
Почему бы не сделать это в два этапа? Скопировать его, а затем добавить?
Фахим Митха
@FaheemMitha: Это работает, спасибо! Я действительно могу понять причину проблемы. Пожалуйста, смотрите мой новый пост ?
Тим
С параметром -f вам не нужен закрытый ключ, так что вы можете просто передать ему ключ только с чьим-то открытым ключом!
Kzqai

Ответы:

67

OpenSSH поставляется с командой для этого ssh-copy-id. Вы просто даете ему удаленный адрес, и он добавляет ваш открытый ключ в authorized_keysфайл на удаленной машине:

$ ssh-copy-id tim@just.some.other.server

Возможно, вам понадобится использовать -iфлаг, чтобы найти ваш открытый ключ на вашем локальном компьютере:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub tim@just.some.other.server
Михаил Мрозек
источник
1
Благодарность! Почему моя команда не работает?
Тим
@ Тим Этот ответ объяснил это; >>обрабатывается вашей оболочкой, и вы запускаете команду через SSH, а не через оболочку. Его исправление SSH для запуска оболочки, которая затем запускает вашу команду, должно сработать
Майкл Мрозек
Благодарность! (1) ssh-copy-id тоже не работает. Я вручную копирую файл на пульт и добавляю его содержимое, после чего он работает. Интересно, почему это? Я обнаружил, что моя оболочка по умолчанию на сервере - это какой-то скрипт, который я обновляю до своего исходного поста, и это может быть причиной. Пожалуйста, посмотрите. (2) Интересно, если ssh-copy-id просто копирует открытый ключ на удаленный компьютер, он не создает закрытый и открытый ключ?
Тим
1
Давайте предположим, что сервер SSH настроен таким образом, что он принимает только аутентификацию с открытым ключом в качестве механизма аутентификации. В этом случае использование ssh-copy-idне будет работать, верно?
Абдул
1
@Abdull Нет, если у вас уже нет другого ключа на этом компьютере для подключения. Это просто соединение через SSH
Майкл Мрозек
31

Вы всегда можете сделать что-то вроде этого:

scp ~/.ssh/id_rsa.pub user@remote.example.com:/tmp/id_rsa.pub
ssh user@remote.example.com 
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

Я не уверен, если вы можете catс локальной машины в сеанс SSH. Просто переместите его в / tmp, как предложено.

Редактировать: это именно то, что ssh-copy-idделает. Как сказал Майкл.

Мистер обезьяна
источник
Благодарность! Интересно, если ssh-copy-id просто скопировать открытый ключ на удаленный компьютер? Это не создает закрытый и открытый ключ, не так ли?
Тим
Нет, это не создает его. Просто добавляет это.
Мистер Обезьяна
@ Mr.Monkey Да, вы можете передавать данные в сеанс SSH (из catили иным образом). То, что вы описываете, является старомодным способом; ssh-copy-idрекомендуется, потому что есть меньше риска опечаток или предоставления файлам неправильных разрешений.
Жиль "ТАК - перестань быть злым"
@Gilles, у вас не всегда есть доступ к серверу для клиента, особенно когда вы готовите компьютер к его работе, поэтому этот метод намного лучше, чем использование ssh-cpy-id, потому что вам не нужно брать оборудование или подключитесь к сети перед настройкой.
e-info128
1
Или вы можете просто труба непосредственно к месту назначения : cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> ~/.ssh/authorized_keys'.
Пабло А
7

Этот ответ описывает, как сделать так, как показано в вопросе.

Вы можете запустить оболочку на удаленном компьютере для интерпретации специального значения >>оператора перенаправления:

ssh tim@just.some.other.server sh -c "'cat >> .ssh/authorized_keys'" < /home/tim/.ssh/id_rsa.pub

Оператор перенаправления >>обычно интерпретируется оболочкой.

При выполнении ssh host 'command >> file'тогда не гарантируется, что command >> fileбудет интерпретироваться оболочкой. В вашем случае command >> fileвыполняется вместо оболочки без специальной интерпретации и >>был передан команде в качестве аргумента - так же, как запуск command '>>' fileв оболочке.

Некоторые версии SSH (OpenSSH_5.9) автоматически вызывают оболочку на удаленном сервере и передают ей команды, когда обнаруживают, что токены интерпретируются такой оболочкой, как, например, ; > >>и т. Д.

pabouk
источник
3

opensshдействительно обеспечивает ssh-copy-id. Последовательность будет:

  • Создать достойный ключ 4k

    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa4k
    
  • Запустите ваш ssh-agent и впитайте информацию, как SSH_AGENT_PID, и т. Д.

    ssh-agent -s > ~/mysshagent
    source ~/mysshagent
    rm ~/mysshagent
    
  • Теперь начните загружать ключи в ваш агент SSH

    ssh-add ~/.ssh/id_rsa4k
    
  • Проверьте, что он загружен

    ssh-add -l
    ssh-add -L
    

    Это покажет вам, что у вас есть в ssh-agent

  • Теперь собственно SSH к удаленной системе

    ssh username@remotehost.network
    
  • Теперь вы можете запустить ssh-copy-id без аргументов:

    ssh-copy-id
    

    Это создает ~/.ssh/authorized_keysи заполняет основную информацию, требуемую от ssh-agent.

Кристифер Дж. Томпсон
источник
Кстати, я создал небольшой скрипт на github.com/centic9/generate-and-send-ssh-key, который выполняет большинство этих шагов за один раз и дополнительно обеспечивает права доступа к файлам / каталогам, которые обычно всегда вызывали у меня головные боли ...
centic
Это отличный метод для использования, когда пароль отключен. Это позволяет добавить новый ключ при аутентификации с использованием предыдущего ключа.
MountainX
1

У меня были проблемы с ssh-copy-id при выборе другого порта, кроме 22 ... так вот мой oneliner с другим ssh-портом (например, 7572):

ssh yourServer.dom -p7572 "mkdir .ssh; chmod 700 .ssh; umask 177; sh -c 'cat >> .ssh/authorized_keys'" < .ssh/id_rsa.pub
user2664227
источник
0

Действительноthe ssh-copy-id команда делает именно это (из openssh-clientпакета):

ssh-copy-id user@host

Примечание:
hostозначает IP-адрес или домен .


Я хотел бы также добавить дополнительную информацию к этому

1) Мы можем указать другой порт для SSH на целевом сервере:

ssh-copy-id "-p 8127 user@host"

Примечание
. Порт должен находиться перед user@hostили не будет разрешен.

Источник

2) Мы можем указать файл с открытым ключом :

ssh-copy-id -i ~/.ssh/id_rsa.pub user@host

Примечание: опция позволяет указать соответствующее местоположение имени с файлом , который содержит открытый ключ.
-i

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

simhumileco
источник