Puoi impostare le password in .ssh / config per consentire l'accesso automatico?


93

Sto usando Ubuntu 11.10. Sto usando sshper connettermi a molti server ogni giorno, quindi inserisco i loro parametri nel .ssh/configfile in questo modo:

Host Home
User netmoon
Port 22
HostName test.com

Esiste un modo per inserire le password per ogni connessione in questo file, in modo che, quando il server richiede la password, il terminale inserisca la sua password e la mandi al server?

Ho bisogno di questo perché a volte mi distacco dal PC e quando torno, digitare una password e premere Enteril terminale dice CONNECTION CLOSED.

PS Non voglio usare una coppia di chiavi pubblica / privata.


1
Sono nella stessa situazione e non riesco a caricare la mia chiave pubblica perché ho accesso ssh solo per svn. Cioè se provo ssh svnhost ottengo "(success (2 2 () (edit-pipeline svndiff1 absent-entry commit-revprops profondità log-revprops partial-replay)))" svnserve response and not the shell
Uberto

Risposte:


56

Negoziare sicurezza per comodità non finisce mai bene ...

Potresti usare ssh-copy-iddal openssh-clientpacchetto?

Da man ssh-copy-id:

ssh-copy-id è uno script che utilizza ssh per accedere a una macchina remota e aggiungere il file di identità indicato al file ~ / .ssh / authorized_keys di quella macchina.


12
Questo non funziona se l'amministratore remoto insiste sulla disabilitazione dell'autorizzazione della chiave pubblica ...
tomasz,

2
Sì, ma essere realistici su sistemi sotto la tua completa supervisione e controllo diretti non è un compromesso. Ad esempio, ad esempio, su una macchina virtuale vagabonda senza connessioni esterne utilizzate esclusivamente a scopo di sviluppo su un'unica postazione.
Scott,

36
Anche insistere sulla sicurezza draconiana senza causa non finisce mai bene.
cwallenpoole,

6
A volte finisce bene.
Devth,

3
IMHO, l'insistenza delle password per l'autenticazione è più rischiosa che no. Spesso imposto spesso password usate per ssh come variabili d'ambiente, poiché detesto ricordare un insieme di stringhe arbitrarie. Richiedere agli utenti di inserirli è semplicemente chiedere loro di essere archiviati male.
Eggmatters,

26

Se non si desidera realmente utilizzare una coppia di chiavi pubblica / privata, è possibile scrivere uno expectscript per inserire automaticamente la password in base all'indirizzo di destinazione.

Modifica: voglio dire che puoi avere uno script che, da un lato, utilizza expectper inserire la password per te e, dall'altro, legge la password per un determinato utente e host da un file di configurazione. Ad esempio, il seguente script python funzionerà per lo scenario di una giornata di sole:

#!/usr/bin/python                                                                                                                        
import argparse
from ConfigParser import ConfigParser
import pexpect

def main(args):
    url = args.url
    user, host = url.split('@', 1)

    cfg_file = 'ssh.cfg'
    cfg = ConfigParser()
    cfg.read(cfg_file)
    passwd = cfg.get(user, host)

    child = pexpect.spawn('ssh {0}'.format(url))
    child.expect('password:')
    child.sendline(passwd)
    child.interact()

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Run ssh through pexpect')
    parser.add_argument('url')
    args = parser.parse_args()
    main(args)

e il formato del file di configurazione sarebbe il seguente:

[user_1]
host1 = passwd_1
host2 = passwd_2

[user_2]
host1 = passwd_1
host2 = passwd_2

Nota: Come spiegato, lo script python dovrebbe essere molto più complesso per gestire tutti i possibili errori e messaggi di domande da ssh e tutti i possibili URL (nell'esempio si presume che sarà qualcosa di simile user@host, ma la parte utente non è ' ho usato la maggior parte delle volte), ma l'idea di base sarebbe sempre la stessa. Per quanto riguarda il file di configurazione, è possibile utilizzare un file di configurazione diverso o utilizzare .ssh/confige scrivere il proprio codice per analizzare quel file e ottenere la password per un determinato utente e host.


puoi spiegare ulteriormente?
Netmoon,

@Netmoon Ho aggiunto un piccolo esempio alla mia risposta alla mia più chiara.
jcollado,

Questo non risponde alla domanda su come inserire la password nel file .ssh / config
Eric Woodruff

1
In effetti, non risponde a questa domanda. Ma risolve il problema: evitare di digitare le password manualmente e archiviarle in un file. Il che è piuttosto ciò che richiede OP.
Arcesilas,

19

C'è anche un sshpassprogramma per questo. Come usare: sshpass -p MyPa55word ssh me@myservor.com


29
A meno che non si precomponga il comando con uno spazio ( sshpassanziché sshpass), è stata appena memorizzata la password ("MyPa55word") nel file cronologico della shell.
Waltinator,

1
@waltinator buon punto
igor

3
Bene, la domanda che ci si poneva era soddisfacente .ssh/config, perché non anche nella storia delle shell?
Darth Egregious,

Non è ufficialmente su Homebrew ma puoi installarlo da un repository di terze parti con brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb. Altro: gist.github.com/arunoda/7790979
Jacob Ford

read -s password; sshpass -p "$password" ssh me@myservor.com. Ciò impedirà la visualizzazione della password nella storia
Alexander Bird,

19

Che ne dici di ProxyCommand:

Host Home-raw
    HostName test.com
Host Home
   User netmoon
   Port 22
   ProxyCommand sshpass -pmypass ssh netmoon@%h-raw nc localhost %p

Puoi usare anche al ssh -Wposto di nc:

ProxyCommand sshpass -pmypass ssh netmoon@%h-raw -W localhost:%p

Non funzionerà come previsto con l' -Wopzione. Hai qualche soluzione?
Toan Nguyen

2
Mi chiede ancora la password con questo comando proxy ...
Victor Piousbox,

1
Trovo anche che richiede ancora una password. Tutto ciò sembra fare è spostare il problema dal test.comrichiedere una password a Homerichiedere una password. Qual e il punto? Qual è il trucco per farlo funzionare?
Martin Bramwell,

15

No. Questo non è possibile, temo.

L'unica vera alternativa è usare le chiavi private ma hai detto che non vuoi (perché no?).


7
perché non ho il permesso di mettere un'altra chiave sul server.
Netmoon,

2
@Netmoon: se riesci ad accedere, puoi aggiungere una chiave, giusto? Hai solo bisogno dell'accesso in scrittura alla tua home directory, a meno che il sysadmin non abbia impostato le cose in modo strano.
Scott Severance,

4
@ScottSeverance Penso che sia la situazione a cui fa riferimento questa domanda. Non avere la possibilità di aggiungere una chiave. Sì, è strano, ma capita spesso.
user239558,

5
Ho avuto l'esperienza molto comune di ambienti di hosting condiviso in cui l'accesso alla chiave pubblica è disabilitato, quindi anche se è possibile aggiungere chiavi, non vengono utilizzate. va contro la ragione sì, ma è così che molti provider di hosting installano i loro server
billynoah,

1
Ci sono risposte che dimostrano che è possibile
Eric Woodruff

8

Puoi creare una semplice sostituzione di script ssh in / usr / local / bin:

#!/bin/bash

host=$1
password=`awk "/#Password/ && inhost { print \\\$2 } /Host/ { inhost=0 } /Host $host/ { inhost=1 }" ~/.ssh/config`

if [[ -z "$password" ]]; then
  /usr/bin/ssh $*
else
  sshpass -p $password /usr/bin/ssh $*
fi

E poi nel tuo file ~ / .ssh / config puoi usare

Host foohost
    User baruser
    #Password foobarpassword

4

Uso un'applicazione del software VanDyke chiamata SecureCRT .

http://www.vandyke.com/products/securecrt/

Non è gratuito, ma a prezzi molto ragionevoli. L'ho usato per anni (in esecuzione su Windows o utilizzando Wine) per l'accesso remoto, l'emulazione di terminale e la gestione della rete (dispersa). Hanno finalmente rilasciato una versione nativa di Linux all'inizio del 2011.

Supporta impostazioni di accesso complesse (o script), password memorizzate (o certificati), sessioni multiple a schede, ecc.

All'avvio è possibile scegliere quale target remoto (e protocollo) da un elenco strutturato (vista ad albero) di macchine remote (o locali) memorizzate, o semplicemente creare una connessione (che viene quindi memorizzata).

L'ho trovato particolarmente utile per i siti remoti con autenticazione avanzata, porte non standard o negoziazione dell'accesso al firewall.

Se stai effettuando molto l'accesso remoto (parte del tuo ruolo principale), questa applicazione giustificherà le sue spese nel primo mese di utilizzo.


scusa, non capisco. Puoi spiegare ?
Netmoon

1
riformulato per te ..
david6

2
Da quando è stata pubblicata la risposta di cui sopra, ci sono state diverse iterazioni di SecureCRT, inclusa l'ultima VanDyke appena rilasciata all'inizio di dicembre 2013. Ogni iterazione ha migliorato il programma rendendolo ancora più versatile. Ha anche una ricca API che consente al programma di essere controllato / interfacciato con script Python / VB. SecureCRT fa parte del mio toolkit di base da un decennio, e lo consiglio vivamente.
Ville

Concordato. Continuo a testare beta ogni nuova versione e sono stato fortemente coinvolto nei primi test per il porting su Ubuntu .
david6

2

Rispondendo alla domanda che hai posto, no non è possibile configurare una password predefinita in un file di configurazione ssh.

Ma se davvero, come dici tu, è "perché a volte mi distacco dal PC e quando torno, digitare una password e premere Enteril terminale dice CONNECTION CLOSED" , allora perché non impedire invece di chiudere la sessione? SSH può mantenere vive le connessioni per te.

Host Home
  User netmoon
  Port 22
  HostName test.com
  ServerAliveInterval 300
  ServerAliveCountMax 2

1

Grazie, Arek per l'ispirazione ...

Invece di eseguire un altro processo di shell, questa è solo una funzione in esecuzione nella shell bash corrente. Esegue un singolo awkcomando per analizzare il file di configurazione e capire se dovrebbe prendere la password da una variabile di shell o dalla password scritta in chiaro nel file di configurazione di ssh (con awkin evalinvece che a describecausa di problemi che ho colpito usando describe).

Ho provato così tanti modi di utilizzare sshpassdirettamente in un sshfile di configurazione usando ProxyCommand, ma nulla sembrava funzionare come previsto, tranne quando potevo accedere a un box tramite RSA. Ma poi avevo bisogno di inviare una password per aprire la mia directory crittografata. Tuttavia, la mia funzione di seguito sembra funzionare per me in tutti i casi, anche per Cygwin.

# In your .bash_profile
function ssh(){
    host=$1;
    unset PASSWORD
    unset PASSVAR
    eval $(awk "/ *#[Pp]assvar / && inhost { printf \"PASSVAR=%s\",\$2; exit 1 } / *#[Pp]assword / && inhost { printf \"PASSWORD=%s\",\$2; } /^#?[Hh][oO][sS][tT] / && inhost { inhost=0; exit 1 } /^[Hh][oO][sS][tT] $host\$/ { inhost=1 }" ~/.ssh/config)
    if [[ -z "$PASSWORD" ]] && [[ -z "$PASSVAR" ]]; then
        /usr/bin/ssh -q $* 2>/dev/null
    else
       if [[ -n "$PASSVAR" ]]; then
          PASSWORD=$(TMP=${!PASSVAR-*};echo ${TMP##*-})
       fi
       /usr/local/bin/sshpass -p"$PASSWORD" /usr/bin/ssh -q $* 2>/dev/null
    fi
}
# and setup your passwords (perhaps in .bashrc instead...)
MYPASS_ENVVAR=SomePassword
MYPASSWD_FROM_FILE=$(</home/me/.passwd_in_file)

Quindi una ~/.ssh/configsezione è simile alla seguente:

Host MyHostname
 Port 22
 Hostname 2.1.2.2
 User merrydan
 #Passvar MYPASS_ENVVAR
 #Password Some!Password

Se #Passvar nella sezione di configurazione esiste un , questo sostituisce il #Password.
$MYPASS_ENVVARè la variabile d'ambiente che contiene la tua password.

Godere!


1

La risposta di @BrunoPereira a questa domanda mostra un metodo alternativo per connettersi senza inserire esplicitamente una password ed evitare le chiavi ssh.

È possibile creare uno script, un alias o una funzione nel proprio ~/.bashrcper eseguire rapidamente quel comando.

Ovviamente, ci sono considerazioni sulla sicurezza che dovresti prendere in considerazione con questo approccio.


È fantastico che tu ti colleghi a una soluzione, tuttavia è anche buona prassi andare avanti e pubblicare la soluzione qui. In questo modo, se il collegamento viene mai rimosso (come accade occasionalmente nello scambio di stack), c'è ancora una risposta utilizzabile qui.
Paul,

0

Ecco la mia elaborata variazione sulla risposta di @ ArekBurdach. Offre le seguenti estensioni:

  • l' host può trovarsi ovunque nella sshriga di comando; cioè supporta anche la ssh <args> <host> <commands>sintassi
  • non codifica il percorso per ssh
  • analisi più robusta di ssh_config
  • Bonus: wrapper per scp, troppo

ssh-wrapper

#!/bin/bash

password=$(awk '
BEGIN {
    # Collect the SSH arguments as keys of a dictionary, so that we can easily
    # check for inclusion.
    for (i = 2; i < ARGC; i++) {
        sshArgs[ARGV[i]] = 1
    }

    # Only process the first argument; all others are the command-line arguments
    # given to ssh.
    ARGC = 2
}
$1 == "Password" && inhost { print $2 }
/^\s*Host\s/ {
    if ($2 in sshArgs)
        inhost=1
    else
        inhost=0
}
' ~/.ssh/config "$@")


if [ "$password" ]; then
    sshpass -p "$password" "$(which ssh)" "$@"
else
    "$(which ssh)" "$@"
fi

scp-wrapper

#!/bin/bash

password=$(awk '
BEGIN {
    # Collect the SCP arguments as keys of a dictionary, so that we can easily
    # check for inclusion.
    for (i = 2; i < ARGC; i++) {
        colonIdx = index(ARGV[i], ":")
        if (colonIdx > 0) {
            scpArgs[substr(ARGV[i], 1, colonIdx - 1)] = 1
        }
    }

    # Only process the first argument; all others are the command-line arguments
    # given to scp.
    ARGC = 2
}
$1 == "Password" && inhost { print $2 }
/^\s*Host\s/ {
    if ($2 in scpArgs)
        inhost=1
    else
        inhost=0
}
' ~/.ssh/config "$@")


if [ "$password" ]; then
    sshpass -p "$password" "$(which scp)" "$@"
else
    "$(which scp)" "$@"
fi

Installazione

Definisci gli alias nel tuo ~/.bashrc:

alias ssh=ssh-wrapper
alias scp=scp-wrapper

Configurazione

Con la IgnoreUnknowndirettiva, sshnon ci si lamenta di una Passworddirettiva appena introdotta , quindi (contrariamente alla risposta di @ ArekBurdach), possiamo far apparire questa come una configurazione "reale". Se non ti piace, è banale riportare lo script in quello commentato.

# Allow specifying passwords for Host entries, to be parsed by ssh-wrapper.
IgnoreUnknown Password

Host foohost
    User baruser
    Password foobarpassword

0

Se non si dispone dell'accesso diretto alla coppia di chiavi, è possibile crittografare la password sul proprio computer locale.

Il modo per farlo è crittografare la password usando la chiave oltre al ProxyCommand di @Eric Woodruff.

Un modo per combinare è usare pipe:

openssl rsautl -decrypt -inkey /path/to/decrypt_key -in /path/to/encrypted_password  | sshpass ssh real-destination -tt

dove

Host real-destination
    Hostname test.com
    User netmoon

0

C'è una leggera variante di un modo descritto nel blog su come usare sshpass che può essere trovato qui . Dato che hai un file con password crittografata gpg (come è descritto nel blog) potresti fare qualcosa del genere:

 sshpass -p $(echo $(gpg -d -q .sshpasswd.gpg)) ssh your_desination.xyz

e semplicemente salva quel comando come alias nel tuo .bashrc.

Se vuoi scavalcare questa connessione, potresti fare qualcosa del genere

 Host actual_dest
      Hostname actual.dest.xyz
      User username
      ProxyCommand sshpass -p $(echo $(gpg -d -q ~/.sshpasswd.gpg)) \ 
                   ssh your_destination.xyz nc %h %p
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.