Apakah ssh-add diam jika kunci sudah ada

16

Saya ingin meletakkan ssh-add /path/to/special_keydi bagian atas naskah. Ini berfungsi dengan baik, tetapi selalu meminta frasa sandi. Ini aneh, dan sedikit menjengkelkan, karena masih meminta kata sandi bahkan ketika ssh-add -lmenunjukkan kunci telah ditambahkan.

Apakah ada cara untuk mengatakannya: "tambahkan kunci ini dan tanyakan frasa sandi jika belum ditambahkan, jika tidak lakukan apa-apa"?

Darren Cook
sumber
Pertanyaan serupa di superuser.com/q/325662
Darren Cook

Jawaban:

20

Saya tidak melihat opsi untuk ssh-add yang membantu mencapai hasil yang Anda inginkan, tetapi cukup mudah untuk menyelesaikannya, mengingat Anda khawatir dengan satu kunci pada khususnya.

Pertama, ambil sidik jari untuk special_key Anda:

ssh-keygen -lf /path/to/special_key  | awk '{print $2}'

Katakanlah sidik jari ini terlihat seperti 6d: 98: ed: 8c: 07: 07: fe: 57: bb: 19: 12: 89: 5a: c4: bf: 25

Kemudian, di bagian atas skrip Anda, gunakan ssh-add -luntuk memeriksa apakah kunci itu dimuat, sebelum diminta untuk menambahkannya:

ssh-add -l |grep -q 6d:98:ed:8c:07:07:fe:57:bb:19:12:89:5a:c4:bf:25 || ssh-add /path/to/special_key

Anda dapat melipat semua ini menjadi satu baris jika Anda ingin:

ssh-add -l |grep -q `ssh-keygen -lf /path/to/special_key  | awk '{print $2}'` || ssh-add /path/to/special_key
Lars Rohrbach
sumber
One-liner bekerja dengan baik, terima kasih!
Darren Cook
1
Saya menemukan ini satu-liner disederhanakan menjadi sedikit lebih mudah dipahami, dan lebih disukai karena menghindari ssh-keygen(setelah semua, saya tidak ingin menghasilkan kunci apa pun), alih-alih menggunakan jalur kunci:ssh-add -l | grep -q 'path/to/key' || ssh-add /path/to/key
ohruunuruus
1
ssh-keygendalam jawaban tidak menghasilkan kunci - sama seperti ssh-add -lpada contoh Anda sebenarnya tidak menambahkan apa pun. Bendera memodifikasi perilaku perintah sehingga tidak sama persis dengan namanya. Perhatikan bahwa versi ini berbeda secara fungsional - jika memeriksa dengan jalur dan kunci pada jalur itu berubah, versi Anda tidak akan mengambilnya. Versi dalam jawaban juga akan mendeteksi kunci yang ada di mana pun dari mana itu diambil.
Richlv
5

Tidak ada cara langsung untuk memeriksa menggunakan hanya ssh-addtetapi Anda dapat menggunakan ssh-keygendan beberapa skrip untuk memeriksa.

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi

Di atas akan mencetak yesjika sidik jari diwakili oleh file /path/to/special_keyhadir dalam ssh-add -loutput.

Contoh

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi
yes

Di mana isi output ssh-keygen -lf /path/to/special_keyterlihat seperti ini:

$ ssh-keygen -lf /path/to/special_key
2048 8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c  dev-servers (RSA)

Dan kami menggunakan `awk '{print $ 2}' untuk memilih kolom ke-2, yang berisi sidik jari, yaitu:

8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c

Referensi

slm
sumber
3

Anda mungkin memiliki alasan tertentu untuk menggunakan ssh-addsecara eksplisit, tetapi jika Anda hanya ingin "Saya ingin diminta untuk frasa sandi saya saat pertama kali saya menggunakan kunci, tetapi tidak setelah itu," openssh memiliki solusi yang lebih sederhana:

Taruh AddKeysToAgent yes.ssh/config file Anda .

Nate
sumber
Terima kasih. Itu tampaknya ditambahkan di ssh 7.2 (Ubuntu 18 tampaknya ada di versi 7.6).
Darren Cook
Yup, "AddKeysToAgent tidak didukung oleh versi openssh saya" adalah alasan yang baik untuk menggunakan ssh-add secara eksplisit ;-)
Nate
0

ssh-add -K FILEbekerja dengan baik untuk saya di Mac.
Itu masih menunjukkan "Identity ditambahkan:" baris tetapi tidak meminta kata sandi.

Dari halaman manual:

-K Saat menambahkan identitas, setiap frasa sandi juga akan disimpan di gantungan kunci pengguna. Saat menghapus identitas dengan -d, setiap frasa sandi akan dihapus dari itu.

Ivan
sumber