Як скопіювати відкритий ключ на 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

Чому б не зробити це в два кроки? Скопіюйте його впоперек, а потім додайте?
Faheem Mitha

@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
Спасибі! Чому моя команда не працює?
Тім

@Tim Ця відповідь пояснила це; >>обробляється вашою оболонкою, і ви виконуєте команду через SSH, а не через оболонку. Його фіксація того, що SSH запустить оболонку, яка потім виконує вашу команду, повинна спрацювати
Майкл Мрозек

Спасибі! (1) також не працює ssh-copy-id. Я вручну копіюю файл у віддалений і додаю його вміст, потім він працює. Цікаво, чому це? Я виявив, що моя оболонка за замовчуванням на сервері - це якийсь сценарій, який я оновлюю до свого початкового повідомлення, і це може бути причиною. Будь ласка, подивіться. (2) Цікаво, чи ssh-copy-id - це просто скопіювати відкритий ключ на віддалений, він не створює приватний та відкритий ключ, чи не так?
Тім

1
Припустимо, що сервер SSH налаштований таким чином, що він приймає лише автентифікацію відкритого ключа як механізм аутентифікації. У такому випадку використання ssh-copy-idне буде працювати, правда?
Абдулл

1
@Abdull Тільки якщо у вас вже є якась інша клавіша на цій машині, з якою ви зможете з'єднатися. Це просто з'єднання через SSH
Michael Mrozek

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) автоматично викликають оболонку на віддалений сервер і передають їй команду, коли вони виявлять лексеми, що інтерпретуються оболонкою, ; > >>тощо.


3

opensshнадає ssh-copy-id. Послідовність буде такою:

  • Створіть гідний 4k ключ

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

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

    ssh-add ~/.ssh/id_rsa4k
    
  • Перевірте, чи він завантажений

    ssh-add -l
    ssh-add -L
    

    Це покаже вам, що у вас є в ssh-агенті

  • Тепер фактично SSH для віддаленої системи

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

    ssh-copy-id
    

    Це створює ~/.ssh/authorized_keysі заповнює основну інформацію, необхідну від ssh-агента.


До речі, я створив невеликий сценарій на 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

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параметр дозволяє нам вказати відповідне місце імені разом із файлом, який містить відкритий ключ.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.