Bisakah saya masuk secara otomatis ke ssh menggunakan kata sandi dari gantungan kunci OS X?

9

Saya perlu masuk ke server ssh yang tidak mendukung otentikasi berbasis kunci. Dan saya tidak ingin mengetik kata sandi setiap waktu.

Saya menggunakan OS X Lion (10.7.2). Saya telah menambahkan kata sandi ke gantungan kunci OS X [1]. Sekarang saya dapat mengambil kata sandi secara otomatis dari gantungan kunci menggunakan /usr/bin/security, namun saya tidak dapat menemukan cara untuk mengirim kata sandi ini ke ssh prompt.

Saya juga mencoba sshpass. Namun ketika saya mencoba menjalankannya ssh keluar dengan kesalahan berikut:

ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied, please try again.
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied (publickey,password).

Adakah saya bisa login ke server ini tanpa harus memasukkan kata sandi setiap saat?

Catatan

  1. Skema yang saya gunakan di gantungan kunci terlihat seperti ini
    • Jenis: Kata sandi Internet
    • Username akun
    • Di mana: ssh: // nama-server
Chaitanya Gupta
sumber

Jawaban:

11

Sesi SSH non-interaktif

Jika Anda tidak perlu memiliki sesi interaktif di server jauh, Anda dapat mengeksekusi sshdi lingkungan tanpa tty, misalnya sebagai bagian dari tindakan Run Shell Script di Automator .

Anda perlu membuat program yang ketika dipanggil mencetak kata sandi ke standar keluar, misalnya skrip bash berikut yang Anda perlukan agar dapat dieksekusi menggunakan chmod +x pwd.sh:

#!/usr/bin/env bash
echo "password"

Kemudian, tetapkan SSH_ASKPASSvariabel lingkungan ke jalur ke program ini, dan kemudian jalankan sshdalam tindakan Automator, seperti ini:

export SSH_ASKPASS=/Users/danielbeck/pwd.sh
ssh user@hostname ls

Ketika tidak ada tty, tetapi SSH_ASKPASSdan DISPLAY(untuk X11, ditetapkan secara default) diatur, SSH mengeksekusi program yang ditentukan oleh SSH_ASKPASSdan menggunakan outputnya sebagai kata sandi. Ini dimaksudkan untuk digunakan dalam lingkungan grafis, sehingga sebuah jendela dapat muncul menanyakan kata sandi Anda. Dalam hal ini, kami hanya melewatkan jendela, mengembalikan kata sandi dari program kami. Anda dapat menggunakannya securityuntuk membaca dari gantungan kunci Anda, seperti ini:

#!/usr/bin/env bash
security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2

ls(pada sshbaris perintah) adalah perintah yang dieksekusi ketika sshtelah masuk, dan hasilnya dicetak dalam Automator. Anda tentu saja dapat mengarahkannya ke file untuk mencatat keluaran dari program yang Anda mulai.


Sesi SSH interaktif menggunakan sshpass

Saya mengunduh, mengompilasi, dan menginstal sshpassdan bekerja dengan sempurna. Inilah yang saya lakukan:

  1. Dapatkan alat pengembang Apple
  2. Unduh dan buka sshpass-1.05.tar.gz
  3. Buka shell ke direktori sshpass-1.05
  4. Lari ./configure
  5. Lari make
  6. Jalankan make install(Anda mungkin perlu sudountuk itu)

Sekarang program diinstal ke /usr/local/bin/sshpass. Jalankan menggunakan garis seperti berikut:

sshpass -pYourPassword ssh username@hostname

Anda dapat membaca kata sandi securitytepat sebelum melakukannya, dan menggunakannya seperti ini:

SSHPASSWORD=$( security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2 )
sshpass -p"$SSHPASSWORD" ssh username@hostname

Bungkus ini dalam fungsi shell dan Anda bisa mengetik misalnya ssh-yourhostnameuntuk menghubungkan, setelah itu mengambil dan memasukkan kata sandi secara otomatis.

Daniel Beck
sumber
Hai, saya telah meningkatkan jawaban Anda karena itu membawa saya ke solusi. Namun, apa yang Anda jelaskan di sini tidak berfungsi dengan baik (ini mungkin khusus untuk versi Lion dari ssh) 1) Untuk sesi non-interaktif, ssh masih meminta saya kata sandi, dan setelah saya memasukinya, saya dapat STDIN is not a terminal. 2) Untuk sesi interaktif dengan sshpass, -popsi tampaknya tidak melakukan apa pun. Tetapi menjalankan sshpasssementara SSH_ASKPASSdiatur tidak bekerja!
Chaitanya Gupta
@ChaitanyaGupta Odd. Ini bekerja untuk saya secara non-interaktif dari dalam Automator on Lion. Mengenai masalah kedua, mungkin saja saya memiliki sesi shell yang kotor pada saat itu, saya tidak yakin lagi. Memberi +1 kepada Anda, dan terima kasih telah menambahkan solusi Anda ke situs.
Daniel Beck
Buruk saya (mengenai 1) - Saya mencoba menjalankan sesi non-interaktif di terminal dan bukan Automator. Saya mencobanya di Automator sekarang, dan saya masih mendapatkan STDIN is not a terminalkesalahan. Namun, kali ini saya tidak dimintai kata sandi; Saya percaya SSH_ASKPASSbekerja di Automator karena, jika saya membuat file SSH_ASKPASSdengan kata sandi yang salah, saya mendapatkan Permission denied, please try again.kesalahan.
Chaitanya Gupta
1
Untuk contoh terakhir perhatikan bahwa di bawah Unix like OSes, argumen baris perintah dan variabel lingkungan dapat terlihat oleh pengguna lain di sistem, jadi ini tidak aman di lingkungan multi-pengguna yang sensitif.
Jürgen Strobel
@DanielBeck Ide apa pun bagaimana membuatnya bekerjamacOs >= 10.13
nbari
7

Saya menemukan solusi (terima kasih kepada Daniel Beck untuk memberikan info kunci yang diperlukan untuk ini). Perhatikan bahwa saya hanya menguji ini dengan OS X Lion 10.7.2. Jika ini tidak berhasil untuk Anda, cobalah solusi Daniel.

Pertama kita perlu mengatur SSH_ASKPASSvariabel lingkungan - nilainya harus menjadi jalur ke program yang mencetak kata sandi ke output standar. Untuk mendapatkan kata sandi dari gantungan kunci, seperti inilah tampilannya (saya menyebutnya get-ssh-password.sh):

#!/bin/bash

/usr/bin/security find-internet-password -a "$SSH_PASSWORD_USER" -s "$SSH_PASSWORD_HOSTNAME" -r "ssh " -g 2>&1 1>/dev/null | cut -d\" -f2

Beberapa hal yang perlu diperhatikan:

  1. Ini mengasumsikan bahwa Anda telah menyimpan kata sandi di gantungan kunci dengan cara yang telah saya jelaskan dalam pertanyaan

  2. Program yang diberikan SSH_ASKPASSakan dipanggil tanpa argumen; jadi kami menggunakan variabel lingkungan untuk meneruskan pengguna dan nama host ke sana.

Sekarang kita dapat mengatur SSH_PASSWORD_USERdan SSH_PASSWORD_HOSTNAMEdan menjalankan sshpassuntuk masuk ke server kami.

Saya membuat skrip lain ssh-kcpass,, untuk melakukan ini:

#!/bin/bash

export SSH_ASKPASS=~/bin/get-ssh-password.sh
export SSH_PASSWORD_USER=$(echo "$1" | cut -d@ -f1)
export SSH_PASSWORD_HOSTNAME=$(echo "$1" | cut -d@ -f2)

sshpass ssh "$1"

Untuk masuk ke server ssh tanpa mengetikkan kata sandi apa pun, Anda hanya perlu menjalankannya ssh-kcpass user@hostname.

Chaitanya Gupta
sumber
Cara membuatnya bekerjamacOS >= 10.13
nbari
-3

Hai, orang-orang yang saya temui di topik ini mencari sesuatu yang lain tapi ... Tidak tahu apakah saya kehilangan sesuatu di sini ... tetapi pendekatan Anda tampaknya aneh bagi saya. mengapa tidak hanya menggunakan otentikasi kunci publik ... Menghasilkan kunci rsa $ ssh-keygen -t rsa -b 2048 -C 'email / id'

Idealnya Anda akan menggunakan sekali ssh-copy-id user @ host dan mengesahkan dengan kata sandi sekali untuk menginstal kunci di server lain, atau menggunakan segala jenis skrip atau alat authomation untuk menyebarkan kunci ke ~ / .ssh / berwenang_kunci pada host lain (untuk pengguna yang ingin Anda masuki) Jika dilakukan dengan perintah secara manual maka Anda harus mengedit /etc/ssh/sshd_config sesuai dan dengan otomatisasi (koki, mungkin) Anda akan mendorong condiga penuh untuk keadaan yang diinginkan.

Kunci yang penting untuk didistribusikan adalah id_rsa.pub, jaga kerahasiaannya

Untuk menggunakan gantungan kunci untuk mengautentikasi ke host dengan mode edit langsung dan otomatis pada mesin Anda, ~ / .ssh / config dan tambahkan:

Tuan rumah * GunakanKeychain ya

Cari info lebih lanjut tentang opsi file konfigurasi ssh berharap semua ini berguna

Ricardo Mendes
sumber
1
Baca kalimat pertama dari badan pertanyaan: '' Saya perlu masuk ke server ssh yang tidak mendukung otentikasi berbasis kunci. ''
Scott
Halo Scott. Saya pikir Anda juga melewatkan bagian di mana ia mengatakan ia tidak ingin mengetik kata sandi setiap kali, yang berarti ia melakukannya.
Ricardo Mendes
Tidak, saya tidak ketinggalan. Mengapa Anda percaya bahwa saya melakukannya?
Scott
Bc Anda masih berbicara
Ricardo Mendes