Bagaimana Anda menyalin kunci publik ke ssh-server?


33

Inilah yang saya coba, dan saya mendapat kesalahan:

$ 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

Mengapa tidak melakukannya dalam dua langkah? Salin ke seberang lalu tambahkan?
Faheem Mitha

@FaheemMitha: Itu berhasil, terima kasih! Saya sebenarnya mungkin menyadari penyebab masalah. Silakan lihat posting baru saya ?
Tim

Dengan parameter -f Anda tidak perlu kunci privat, jadi Anda bisa meneruskan kunci itu hanya dengan kunci publik seseorang!
Kzqai

Jawaban:


67

OpenSSH datang dengan perintah untuk melakukan ini ssh-copy-id,. Anda cukup memberinya alamat jarak jauh dan menambahkan kunci publik Anda ke authorized_keysfile di mesin jarak jauh:

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

Anda mungkin perlu menggunakan -ibendera untuk menemukan kunci publik di mesin lokal Anda:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub tim@just.some.other.server

1
Terima kasih! Mengapa perintah saya tidak berfungsi?
Tim

@ Tim Jawaban ini menjelaskannya; >>ditangani oleh shell Anda, dan Anda menjalankan perintah melalui SSH bukannya melalui shell. Cara memperbaiki SSH menjalankan shell, yang kemudian menjalankan perintah Anda, akan berhasil
Michael Mrozek

Terima kasih! (1) ssh-copy-id juga tidak berfungsi. Saya menyalin file secara manual ke remote dan menambahkan kontennya, lalu berfungsi. Saya bertanya-tanya mengapa ini? Saya menemukan bahwa shell default saya di server adalah beberapa skrip, yang saya perbarui ke posting asli saya, dan mungkin menjadi alasannya. Mohon dilihat. (2) Saya ingin tahu apakah ssh-copy-id hanya menyalin kunci publik ke remote, itu tidak membuat kunci pribadi dan publik, bukan?
Tim

1
Mari kita asumsikan server SSH dikonfigurasi sedemikian rupa sehingga hanya menerima otentikasi kunci publik sebagai mekanisme otentikasi. Dalam hal itu, menggunakan ssh-copy-idtidak akan berhasil, bukan?
Abdull

1
@Abdull Tidak kecuali Anda sudah memiliki kunci lain pada mesin itu untuk terhubung. Ini hanya terhubung melalui SSH
Michael Mrozek

31

Anda selalu dapat melakukan sesuatu seperti ini:

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

Saya tidak yakin apakah Anda dapat catdari mesin lokal ke sesi ssh. Pindahkan saja ke / tmp seperti yang disarankan.

Sunting: Ini persis seperti apa ssh-copy-id. Seperti yang dikatakan Michael.


Terima kasih! Saya bertanya-tanya apakah ssh-copy-id hanya menyalin kunci publik ke remote. Itu tidak membuat kunci pribadi dan publik, bukan?
Tim

Tidak itu tidak membuatnya. Tambahkan saja.
Tn. Monkey

@ Mr.Monkey Ya, Anda dapat mengirim data ke sesi ssh (dari catatau sebaliknya). Apa yang Anda gambarkan adalah cara kuno; ssh-copy-iddirekomendasikan karena ada sedikit risiko kesalahan pengetikan atau memberikan file izin yang salah.
Gilles 'SANGAT berhenti menjadi jahat'

@Gilles, Anda tidak selalu memiliki akses ke server ke klien, terutama ketika Anda menyiapkan komputer untuk operasinya, jadi metode ini jauh lebih baik daripada menggunakan ssh-cpy-id karena Anda tidak perlu membawa peralatan atau terhubung ke jaringan sebelum pengaturan.
e-info128

1
Atau Anda bisa hanya pipa langsung ke tujuan : cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> ~/.ssh/authorized_keys'.
Pablo A

7

Jawaban ini menjelaskan cara membuat cara yang dimaksudkan ditampilkan dalam pertanyaan bekerja.

Anda dapat mengeksekusi shell pada komputer jarak jauh untuk menafsirkan makna khusus dari >>operator pengalihan:

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

Operator pengalihan >>biasanya ditafsirkan oleh shell.

Ketika Anda mengeksekusi ssh host 'command >> file'maka itu tidak dijamin yang command >> fileakan ditafsirkan oleh shell. Dalam kasus Anda command >> filedieksekusi bukannya shell tanpa interpretasi khusus dan >>diberikan kepada perintah sebagai argumen - cara yang sama seperti menjalankan command '>>' fileshell.

Beberapa versi SSH (OpenSSH_5.9) akan secara otomatis memanggil shell pada server jarak jauh dan meneruskan perintahnya ketika mereka mendeteksi token yang akan ditafsirkan oleh shell seperti ; > >>dll.


3

opensshmemang menyediakan ssh-copy-id. Urutannya adalah:

  • Hasilkan kunci 4k yang layak

    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa4k
    
  • Mulai ssh-agent Anda dan hisap informasi seperti SSH_AGENT_PID, dll.

    ssh-agent -s > ~/mysshagent
    source ~/mysshagent
    rm ~/mysshagent
    
  • Sekarang mulai memuat kunci ke Agen SSH Anda

    ssh-add ~/.ssh/id_rsa4k
    
  • Periksa apakah sudah dimuat

    ssh-add -l
    ssh-add -L
    

    Ini akan menunjukkan kepada Anda apa yang Anda miliki di ssh-agent

  • Sekarang sebenarnya SSH ke sistem jarak jauh

    ssh username@remotehost.network
    
  • Sekarang Anda dapat menjalankan ssh-copy-id tanpa argumen:

    ssh-copy-id
    

    Ini membuat ~/.ssh/authorized_keysdan mengisi info dasar yang diperlukan dari ssh-agent.


BTW, saya membuat sebuah skrip kecil di github.com/centic9/generate-and-send-ssh-key yang berjalan sebagian besar langkah-langkah dalam satu pergi dan juga memastikan file / izin direktori yang biasanya selalu membuat saya sakit kepala ...
centic

Ini adalah metode yang bagus untuk digunakan ketika login kata sandi dinonaktifkan. Memungkinkan menambahkan kunci baru sambil mengautentikasi dengan kunci sebelumnya.
MountainX

1

Saya memiliki masalah dengan ssh-copy-id ketika memilih port lain dari 22 ... jadi inilah oneliner saya dengan ssh-port yang berbeda (mis. 7572):

ssh yourServer.dom -p7572 "mkdir .ssh; chmod 700 .ssh; umask 177; sh -c 'cat >> .ssh/authorized_keys'" < .ssh/id_rsa.pub

0

Memang para the ssh-copy-idperintah tidak tepat ini (dari openssh-clientpaket):

ssh-copy-id user@host

Catatan:
hostberarti alamat IP atau domain .


Saya juga ingin menambahkan beberapa informasi tambahan untuk ini

1) Kami dapat menentukan port lain untuk SSH di server tujuan:

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

Catatan:
The pelabuhan harus di depan user@hostatau tidak akan menyelesaikan.

Sumber

2) Kami dapat menentukan file dengan kunci publik :

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

Catatan:
The -ipilihan memungkinkan kita untuk menunjukkan lokasi yang tepat dari nama dengan file yang berisi kunci publik.

Kadang-kadang bisa berguna, terutama jika kita menyimpannya di lokasi yang tidak standar atau kita memiliki lebih dari satu kunci publik di komputer kita dan kita ingin menunjuk ke yang tertentu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.