Posso accedere automaticamente a ssh usando le password del portachiavi di OS X?


9

Ho bisogno di accedere a un server SSH che non supporta l'autenticazione basata su chiave. E non voglio digitare le password ogni volta.

Sto usando OS X Lion (10.7.2). Ho aggiunto le password al portachiavi di OS X [1]. Ora posso recuperare automaticamente la password dal portachiavi utilizzando /usr/bin/security, tuttavia non riesco a trovare un modo per inviare questa password al prompt di ssh.

Ho anche provato sshpass. Tuttavia quando provo ad eseguirlo ssh esce con il seguente errore:

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).

Posso comunque accedere a questo server senza dover inserire la password ogni volta?

Gli appunti

  1. Lo schema che uso nel portachiavi è simile al seguente
    • Tipo: password Internet
    • Account: nome utente
    • Dove: ssh: // nome-server

Risposte:


10

Sessioni SSH non interattive

Se non è necessario disporre di una sessione interattiva sul server remoto, è possibile eseguire sshin un ambiente senza tty, ad esempio nell'ambito di un'azione Esegui script shell in Automator .

Devi creare un programma che quando chiamato stampa la password su standard out, ad esempio il seguente script bash che devi rendere eseguibile usando chmod +x pwd.sh:

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

Quindi, imposta la SSH_ASKPASSvariabile di ambiente sul percorso di questo programma, quindi esegui sshl'azione Automator, in questo modo:

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

Quando non c'è tty, ma SSH_ASKPASSe DISPLAY(per X11, impostato di default) sono impostati, SSH esegue il programma specificato da SSH_ASKPASSe usa il suo output come password. Questo è inteso per essere utilizzato in ambienti grafici, in modo che possa apparire una finestra che richiede la password. In questo caso, abbiamo semplicemente saltato la finestra, restituendo la password dal nostro programma. Puoi usare invece securityper leggere dal tuo portachiavi, in questo modo:

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

ls(sulla sshriga di comando) è il comando eseguito quando sshè stato effettuato l'accesso e il suo output è stampato in Automator. Naturalmente, puoi reindirizzarlo su un file per registrare l'output del programma che avvii.


Sessioni interattive SSH utilizzando sshpass

Ho scaricato, compilato e installato sshpasse ha funzionato perfettamente. Ecco cosa ho fatto:

  1. Ottieni gli strumenti per sviluppatori Apple
  2. Scarica e apri sshpass-1.05.tar.gz
  3. Apri una shell nella directory sshpass-1.05
  4. Correre ./configure
  5. Correre make
  6. Esegui make install(potresti averne bisogno sudo)

Ora il programma è installato su /usr/local/bin/sshpass. Eseguire utilizzando una riga come la seguente:

sshpass -pYourPassword ssh username@hostname

Puoi leggere la password securityappena prima di farlo e usarla in questo modo:

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

Impacchettalo in una funzione shell e puoi semplicemente digitare ad es. ssh-yourhostnamePer connetterti, farlo recuperare e inserire automaticamente la password.


Ciao, ho votato a favore della tua risposta da quando mi ha portato alla soluzione. Tuttavia, ciò che hai descritto qui non ha funzionato esattamente (questo potrebbe essere specifico per la versione di Lion di ssh) 1) Per sessioni non interattive, ssh mi ha comunque chiesto una password e dopo averlo inserito, ho ottenuto STDIN is not a terminal. 2) Per le sessioni interattive con sshpass, a quanto -ppare l' opzione non fa nulla. Ma correre sshpassmentre SSH_ASKPASSè impostato funziona!
Chaitanya Gupta,

@ChaitanyaGupta Odd. Ha funzionato per me in modo non interattivo all'interno di Automator su Lion. Per quanto riguarda quel secondo numero, è possibile che a quel punto abbia avuto una sessione di shell sporca, non ne sono più sicuro. +1 a te e grazie per aver aggiunto la tua soluzione al sito.
Daniel Beck

Mio cattivo (rispetto a 1) - Stavo cercando di eseguire la sessione non interattiva nel terminale e non Automator. L'ho provato in Automator ora e ancora ottengo STDIN is not a terminalerrori. Tuttavia, questa volta non mi è stata richiesta alcuna password; Credo che funzioni SSH_ASKPASSin Automator poiché, se faccio in modo che il file SSH_ASKPASSrestituisca la password errata, viene visualizzato un Permission denied, please try again.errore.
Chaitanya Gupta,

1
Per gli ultimi esempi, notare che in Unix come gli argomenti della riga di comando come OS e le variabili di ambiente possono essere visibili ad altri utenti sul sistema, quindi ciò non è sicuro in un ambiente multiutente sensibile.
Jürgen Strobel,

@DanielBeck qualsiasi idea su come farlo funzionaremacOs >= 10.13
nbari

7

Ho trovato una soluzione (grazie a Daniel Beck per aver fornito le informazioni chiave necessarie per questo). Nota che l'ho provato solo con OS X Lion 10.7.2. Se questo non funziona per te, prova la soluzione di Daniel.

Per prima cosa dobbiamo impostare la SSH_ASKPASSvariabile d'ambiente - il suo valore dovrebbe essere il percorso di un programma che stampa la password sullo standard output. Per ottenere la password dal portachiavi, ecco come deve apparire (la chiamo 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

Un paio di punti da notare:

  1. Ciò presuppone che tu abbia memorizzato la password nel portachiavi nel modo che ho descritto nella domanda

  2. Il programma indicato SSH_ASKPASSverrà chiamato senza alcun argomento; quindi usiamo le variabili di ambiente per passarci all'utente e il nome host.

Ora possiamo impostare SSH_PASSWORD_USERed SSH_PASSWORD_HOSTNAMEed eseguire sshpassper accedere al nostro server.

Ho creato un altro script ssh-kcpass, per fare questo:

#!/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"

Per accedere al server ssh senza digitare alcuna password, è sufficiente eseguire ssh-kcpass user@hostname.


Come farlo funzionare amacOS >= 10.13
nbari

-2

Ciao a tutti, mi sono imbattuto in questo argomento alla ricerca di qualcos'altro ma ... Non so se mi manca qualcosa qui ... ma il tuo approccio mi sembra strano. perché non usare solo l'autenticazione con chiave pubblica ... Genera una chiave rsa $ ssh-keygen -t rsa -b 2048 -C 'email / id'

Idealmente dovresti usare una volta l'utente ssh-copy-id utente @ host e autenticarti con password una volta per installare la chiave sull'altro server, o utilizzare qualsiasi tipo di script o strumento di autorizzazione per distribuire la chiave in ~ / .ssh / authorized_keys su l'altro host (per l'utente a cui si desidera accedere) Se eseguito con il comando manualmente, è necessario modificare / etc / ssh / sshd_config di conseguenza e con l'automazione (chef, ansible) si spingerebbe la condiga completa per lo stato desiderato.

La chiave che conta per la distribuzione è id_rsa.pub, mantenere sicura la chiave privata

Per utilizzare il portachiavi per autenticare gli host in modo semplice e automatico, modifica sul tuo computer ~ / .ssh / config e aggiungi:

Host * UseKeychain yes

Cerca ulteriori informazioni sulle opzioni del file di configurazione ssh spero che tutto ciò sia utile


1
Leggi la prima frase del corpo della domanda: '' Ho bisogno di accedere a un server SSH che non supporta l'autenticazione basata su chiave. ''
Scott,

Ciao Scott, penso che ti sia mancata anche la parte in cui dice che non vuole digitare la password ogni volta, il che significa che lo sta facendo.
Ricardo Mendes,

No, non mi sono perso. Perché dovresti crederci?
Scott,

Bc stai ancora parlando
Ricardo Mendes il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.