Bagaimana cara menambahkan kunci pribadi secara permanen dengan ssh-add di Ubuntu? [Tutup]

474

Saya memiliki kunci pribadi yang dilindungi dengan kata sandi untuk mengakses server melalui SSH.

Saya memiliki 2 mesin linux (ubuntu 10.04) dan perilaku perintah ssh-add berbeda di keduanya.

Dalam satu mesin, setelah saya menggunakan "ssh-add .ssh / identitas" dan memasukkan kata sandi saya, kunci ditambahkan secara permanen, yaitu, setiap kali saya mematikan komputer dan masuk lagi, kunci sudah ditambahkan.

Yang lain, saya harus menambahkan kunci setiap kali saya masuk.

Sejauh yang saya ingat, saya melakukan hal yang sama pada keduanya. Satu-satunya perbedaan adalah bahwa kunci itu dibuat pada salah satu yang ditambahkan secara permanen.

Apakah ada yang tahu cara menambahkannya secara permanen ke mesin lain juga?

duduklein
sumber
1
agen harus bersifat sementara saja; tetapi mungkin saja Anda memiliki perintah ssh-add di suatu tempat di ~ / .bashrc atau lebih pada salah satu dari kedua mesin
mirek

Jawaban:

632

Sebuah solusi akan memaksa file kunci untuk disimpan secara permanen, dengan menambahkannya dalam ~/.ssh/configfile Anda :

IdentityFile ~/.ssh/gitHubKey
IdentityFile ~/.ssh/id_rsa_buhlServer

Jika Anda tidak memiliki file 'config' di direktori ~ / .ssh, maka Anda harus membuatnya. Tidak perlu hak root, jadi cukup:

nano ~/.ssh/config

... dan masukkan baris di atas sesuai kebutuhan Anda.

Agar ini berfungsi, file harus memiliki chmod 600. Anda dapat menggunakan perintah chmod 600 ~/.ssh/config.

Jika Anda ingin semua pengguna di komputer menggunakan kunci, masukkan baris-baris ini ke dalam /etc/ssh/ssh_configdan kunci dalam folder yang dapat diakses oleh semua.

Selain itu jika Anda ingin mengatur kunci khusus untuk satu host, Anda dapat melakukan hal berikut di ~ / .ssh / config Anda:

Host github.com
    User git
    IdentityFile ~/.ssh/githubKey

Ini memiliki keuntungan ketika Anda memiliki banyak identitas yang server tidak menolak Anda karena Anda mencoba identitas yang salah terlebih dahulu. Hanya identitas spesifik yang akan dicoba.

daminetreg
sumber
82
Izin pada file konfigurasi harus 600.chmod 600 config
generalopinion
6
Saya harus memasukkan kata sandi saya untuk setiap push, fetch, atau clone dengan ini, bagaimana saya menghindarinya?
Asaf
9
Gunakan sebagai gantinya ssh-add ~/.ssh/gitHubKey, itu akan mengingat kata sandi utama Anda. Solusi yang saya usulkan adalah mengaturnya secara permanen di seluruh reboot.
daminetreg
28
Jawaban ini sangat bagus sehingga ssh-add seharusnya tidak ada. Siapa yang ingin memiliki perintah yang "sementara" memperbaiki masalah dan tiba-tiba rusak ketika Anda bisa mengedit file konfigurasi secara permanen.
RussellStewart
2
Masalahnya adalah dengan jenis konfigurasi ini, jika Anda tidak melakukannya di .ssh / config untuk Host tertentu, Anda akan mendapatkan semua kunci dicoba terhadap semua server setiap kali.
daminetreg
118

Ini tidak menjawab masalah yang sama bagi saya di bawah Mac OS X Lion. Saya akhirnya menambahkan:

ssh-add ~/.ssh/id_rsa &>/dev/null

Untuk .zshrc saya (tetapi. Profil juga akan baik-baik saja), yang sepertinya telah memperbaikinya.

(Seperti yang disarankan di sini: http://geek.michaelgrace.org/2011/09/permanently-add-ssh-key-ssh-add/ )

Harun
sumber
6
Ini menurut saya lebih baik daripada solusi yang saya usulkan, karena ssh-add menggunakan agen otentikasi yang dapat mengingat frasa sandi kunci pribadi yang dilindungi, sehingga Anda tidak perlu mengetiknya setiap kali Anda mencoba mengautentikasi. Keuntungan lain dari solusi yang Anda usulkan adalah bahwa jika Anda memiliki banyak kunci, klien ssh tidak akan mengusulkan kunci yang tidak relevan untuk server yang Anda coba sambungkan, memang itu hanya akan memberikan kunci yang untuk server ini, dan tidak akan t mengarah ke server menolak koneksi karena MaxAuthTries sedang dihubungi, ketika mencoba semua kunci yang terdaftar di ssh / config.
daminetreg
1
Terima kasih @daminetreg. Masalah khusus saya perlu mengakses gitosis pada mesin pengembangan tanpa mentransfer kunci pribadi saya untuk itu. Solusi ini (bersama dengan menambahkan ForwardAgent yeske saya .ssh/config) memecahkan masalah itu dengan fantastis. Ternyata, itu bisa saja ssh-add &>/dev/nullsebagai perilaku default ssh-addtampaknya menambahkan kunci yang ditemukan di .sshfolder Anda .
Aaron
1
Pemahaman saya adalah bahwa ada saklar -K di Mac OS: stackoverflow.com/questions/1909651/…
Nicu Tofan
3
@TNick -Kmenambahkan kunci ke gantungan kunci OS X, yang digunakan OS X GUI untuk mengautentikasi ke server asing. Poster di Q itu terhubung melalui SSH Tunnel, tetapi masih terhubung ke server jauh. A - [SSH Tunnel] -> B Kasus yang saya masuki adalah saya berada di server jarak jauh tetapi ingin otentikasi bertentangan dengan kredensial pada sistem rumah saya. A <- [Auth] - B - [Connect] -> C Jadi -Ksebenarnya tidak membantu, tetapi merupakan solusi yang bagus untuk yang lain Q.
Aaron
112

Saya memecahkan masalah itu di Mac OSX (10.10) dengan menggunakan opsi -K untuk ssh-add:

ssh-add -K ~/.ssh/your_private_key

Untuk macOS 10.12 dan yang lebih baru Anda perlu mengedit konfigurasi ssh Anda seperti dijelaskan di sini: https://github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain

totas
sumber
3
ini adalah jawaban yang lebih baik untuk orang-orang yang ingin mengaturnya secara permanen
punkrockpolly
12
Karena itu, bit ini: "on Mac OSX (10.10)" ...
Andrew K.
1
Ini bagus dan berfungsi di Mac OSX, tetapi tidak berfungsi di Ubuntu (14,04 pada pengujian saya).
haxpor
5
Ini tidak berhasil untuk saya (pada OSX 10.12.4)
guptron
2
Menurut man ssh-addpada macOS High Sierra, ssh-add -Kakan menyimpan kata sandi ke dalam gantungan kunci, dan setelah reboot, cukup gunakan ssh-add -A, yang tidak mengharuskan Anda untuk memasukkan kata sandi Anda.
DawnSong
36

Cukup tambahkan gantungan kunci, seperti yang dirujuk dalam Kiat Cepat Ubuntu https://help.ubuntu.com/community/QuickTips

Apa

Daripada terus-menerus memulai ssh-agent dan ssh-add, dimungkinkan untuk menggunakan gantungan kunci untuk mengelola kunci ssh Anda. Untuk menginstal gantungan kunci, Anda cukup klik di sini, atau gunakan Synaptic untuk melakukan pekerjaan atau apt-get dari baris perintah.

Garis komando

Cara lain untuk menginstal file adalah membuka terminal (Application-> Accessories-> Terminal) dan ketik:

sudo apt-get install keychain

Edit File

Anda kemudian harus menambahkan baris berikut ke $ {HOME} /. Bashrc atau /etc/bash.bashrc Anda:

keychain id_rsa id_dsa
. ~/.keychain/`uname -n`-sh
Christian Saiki
sumber
Apa sebenarnya yang dilakukan perintah kedua, karena penasaran? ini hanya membuka izin untuk pengguna saat ini?
Vincent Buscarello
1
Ini .adalah alias untuksource
Brad Solomon
18

Saya mencoba solusi @ Harun dan itu tidak berhasil bagi saya, karena itu akan menambahkan kembali kunci saya setiap kali saya membuka tab baru di terminal saya. Jadi saya memodifikasinya sedikit (perhatikan bahwa sebagian besar kunci saya juga dilindungi kata sandi sehingga saya tidak bisa mengirim output ke / dev / null):

added_keys=`ssh-add -l`

if [ ! $(echo $added_keys | grep -o -e my_key) ]; then
    ssh-add "$HOME/.ssh/my_key"
fi

Apa yang dilakukan adalah memeriksa cek dari ssh-add -l(yang mencantumkan semua kunci yang telah ditambahkan) untuk kunci tertentu dan jika tidak menemukannya, maka ditambahkan dengan ssh-add.

Sekarang pertama kali saya membuka terminal saya, saya diminta kata sandi untuk kunci pribadi saya dan saya tidak ditanya lagi sampai saya reboot (atau logout - saya belum memeriksa) komputer saya.

Karena saya memiliki banyak kunci, saya menyimpan output ssh-add -ldalam variabel untuk meningkatkan kinerja (setidaknya saya kira itu meningkatkan kinerja :))

PS: Saya di linux dan kode ini pergi ke ~/.bashrcfile saya - jika Anda menggunakan Mac OS X, maka saya berasumsi Anda harus menambahkannya ke .zshrcatau.profile

EDIT: Seperti yang ditunjukkan oleh @ Harun dalam komentar, .zshrcfile digunakan dari zshshell - jadi jika Anda tidak menggunakan itu (jika Anda tidak yakin, maka kemungkinan besar, Anda menggunakan bashsebagai gantinya), kode ini harus buka .bashrcfile Anda .

Nikola Ivanov Nikolov
sumber
3
.zshrcadalah untuk zshshell, yang saya gunakan bukan bash. Jika Anda menggunakan bashdi Mac OS X (default), itu akan ada di .bashrcsana juga.
Aaron
1
Setelah ssh-add -lkode kembali echo $?dapat digunakan untuk memutuskan apakah akan menambahkan kunci atau tidak. Im mesin linux saya dengan bash, ssh-add -ltidak akan menampilkan nama file kunci. Kode pengembalian selalu berfungsi.
Bharat G
12

Dalam kasus saya, solusinya adalah:

Izin pada file konfigurasi harus 600. chmod 600 config

Seperti disebutkan dalam komentar di atas oleh generalopinion

Tidak perlu menyentuh isi file konfigurasi.

erezmta
sumber
Tidak cukup bagi saya di Linux Mint 17.1.
Benares
Saya pikir 600 tidak masuk akal. man ssh memberi tahu kita bahwa ~/.ssh/configfile tersebut baca / tulis untuk pengguna, dan tidak dapat ditulis oleh orang lain.
DawnSong
600 dibaca dan ditulis hanya untuk pengguna
Enthusiasmus
6

Saya memiliki masalah yang sama pada Ubuntu 16.04: beberapa kunci ditambahkan secara permanen, untuk yang lain saya harus mengeksekusi ssh-addpada setiap sesi. Saya menemukan bahwa kunci yang ditambahkan secara permanen memiliki kunci privat dan publik yang terletak di ~/.sshdan kunci yang dilupakan pada setiap sesi hanya memiliki kunci privat dalam ~/.sshdir. Jadi solusi sederhana: Anda harus menyalin baik kunci pribadi dan publik untuk ~/.sshsebelum mengeksekusi ssh-add.

PS: Sejauh yang saya mengerti dari Gnome wiki metode saya berfungsi berkat alat gnome-keyring yang merupakan bagian dari Lingkungan Desktop Gnome. Oleh karena itu metode saya mungkin hanya bisa berfungsi jika Anda menggunakan DE berbasis Gnome atau Gnome.

NShiny
sumber
1
Jawaban yang diremehkan. Ini menyelesaikan masalah saya tanpa perlu skrip atau paket tambahan setelah mencari selama dua jam.
etagenklo
Flarkin luar biasa! Pekerjaan detektif yang bagus. Saya tidak berpikir saya akan menemukan ini.
nicorellius
4

Menambahkan baris berikut di "~ / .bashrc" memecahkan masalah bagi saya. Saya menggunakan desktop Ubuntu 14.04.

eval `gnome-keyring-daemon --start`
USERNAME="reynold"
export SSH_AUTH_SOCK="$(ls /run/user/$(id -u $USERNAME)/keyring*/ssh|head -1)"
export SSH_AGENT_PID="$(pgrep gnome-keyring)"
reynoldpj
sumber
3

Di Ubuntu 14.04 (mungkin lebih awal, mungkin masih) Anda bahkan tidak memerlukan konsol:

  • Mulailah seahorse atau luncurkan hal yang Anda temukan sedang mencari "kunci"
  • buat kunci SSH di sana (atau impor satu)
    • tidak perlu membiarkan kata sandi kosong
    • ditawarkan kepada Anda untuk bahkan mendorong kunci publik ke server (atau lebih)
  • Anda akan berakhir dengan ssh-agent berjalan dan kunci ini dimuat, tetapi dikunci
  • menggunakan ssh akan mengambil identitas (yaitu kunci) melalui agen
  • pada penggunaan pertama selama sesi, frasa sandi akan diperiksa
    • dan Anda memiliki opsi untuk membuka kunci secara otomatis saat login
    • ini berarti autentikasi login akan digunakan untuk membungkus frasa sandi kunci
  • Catatan: jika Anda ingin meneruskan identitas Anda (mis. penerusan agen) meminta Anda sshdengan -Aatau menjadikannya default
    • jika tidak, Anda tidak dapat mengautentikasi dengan kunci itu pada mesin yang Anda masuki nanti ke mesin ketiga
Robert Siemer
sumber
3

Saya menjalankan Ubuntu menggunakan dua kunci id_rsa. (satu pribadi untuk bekerja). ssh-add akan mengingat satu kunci (kunci pribadi) dan melupakan perusahaan itu setiap waktu.

Melihat perbedaan antara keduanya, saya melihat kunci pribadi saya memiliki 400 hak sedangkan perusahaan satu memiliki 600 hak. (sudah u + w). Menghapus pengguna menulis langsung dari kunci perusahaan (uw atau set ke 400) memperbaiki masalah saya. ssh-add sekarang ingat kedua tombol.

Terkutuk
sumber
2

Ini berhasil untuk saya.

ssh-agent /bin/sh
ssh-add /path/to/your/key
Jaseem Abbas
sumber
1

sangat sederhana ^ _ ^ dua langkah

1.Yum menginstal gantungan kunci

2. tambahkan kode di bawah ini ke .bash_profile

/usr/bin/keychain $HOME/.ssh/id_dsa
source $HOME/.keychain/$HOSTNAME-sh
LawrenceLi
sumber
12
Ubuntu Tidak memiliki yum konyol;)
Adam F
1

Bagi mereka yang menggunakan shell Ikan Anda dapat menggunakan fungsi berikut kemudian memanggilnya ~/.config/fish/config.fishatau dalam file konfigurasi terpisah di ~/.config/fish/conf.d/loadsshkeys.fish. Ini akan memuat semua kunci yang dimulai dengan id_rsa ke dalam ssh-agent.

# Load all ssh keys that start with "id_rsa"
function loadsshkeys
  set added_keys (ssh-add -l)
   for key in (find ~/.ssh/ -not -name "*.pub" -a -iname "id_rsa*")
    if test ! (echo $added_keys | grep -o -e $key)
      ssh-add "$key"
    end
  end
end

# Call the function to run it.
loadsshkeys

Jika Anda ingin ssh-agentmemulai otomatis ketika Anda membuka terminal, Anda dapat menggunakan tuvistavie / fish-ssh-agent untuk melakukan ini.

frederickjh
sumber