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

75

Sto usando ubuntu 11.10. Sto usando ssh per collegarmi a molti server ogni giorno, quindi ho messo i loro parametri in .ssh/config file; così:

Host Home
User netmoon
Port 22
HostName test.com

C'è un modo per inserire password in questo file, per ogni connessione? Quindi quando il server richiede la password, il terminale manda il suo pass e lo invia al server.

È perché a volte mi allontano dal pc e quando torno indietro e digito la password, e premo invio, il terminale dice CONNESSIONE CHIUSA.

  • Non voglio utilizzare la coppia di chiavi pubblica / privata.
posta Netmoon 15.12.2011 - 12:36

12 risposte

47

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

Potresti usare ssh-copy-id dal pacchetto openssh-client ?

Da man ssh-copy-id :

ssh-copy-id is a script that uses ssh to log into a remote 
machine and append the indicated identity file to that 
machine's ~/.ssh/authorized_keys file.
    
risposta data waltinator 20.12.2011 - 04:50
24

Se non vuoi utilizzare una coppia di chiavi pubblica / privata, puoi scrivere uno script expect per inserire automaticamente la password in base all'indirizzo di destinazione.

Modifica: Ciò che intendo è che puoi avere uno script che, da una parte, usa expect per inserire la password per te e, d'altra parte, legge la password per un dato utente e host da una configurazione file. Ad esempio, il seguente script python funzionerà per lo scenario del giorno 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 come [email protected] , ma la parte utente non viene usata la maggior parte delle volte), ma l'idea di base sarebbe sempre la stessa. Regadendo il file di configurazione, puoi usare un file di configurazione diverso o usare .ssh/config e scrivere il tuo codice per analizzare quel file e ottenere la password per un dato utente e host.

    
risposta data jcollado 15.12.2011 - 14:26
16

C'è anche un programma sshpass per quello. Come usare: % Co_de%

    
risposta data igor 16.01.2014 - 14:58
15

No. Non è possibile, ho paura.

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

    
risposta data Caesium 15.12.2011 - 12:40
14

Che ne dici di ProxyCommand:

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

Puoi usare ssh -W invece di nc pure:

ProxyCommand sshpass -pmypass ssh [email protected]%h-raw -W localhost:%p
    
risposta data Eric Woodruff 10.06.2015 - 19:48
6

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

#!/bin/bash

host=$1
password='awk "/#Password/ && inhost { print \\ } /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
    
risposta data Arek Burdach 26.09.2016 - 13:54
4

Uso un'applicazione del software VanDyke chiamata SecureCRT .

link

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

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

All'avvio puoi scegliere quale target remoto (e protocollo) da una lista strutturata (vista ad albero) di macchine remote (o locali) memorizzate, o semplicemente creare una connessione (che viene poi memorizzata).

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

Se stai facendo un accesso remoto molto (parte del tuo ruolo principale), allora questa applicazione giustifica la sua spesa nel primo mese di utilizzo.

    
risposta data david6 16.12.2011 - 06:37
2

Rispondendo alla domanda che hai posto, non è possibile configurare la password predefinita nel file di configurazione ssh.

Ma se davvero, come dici tu È perché a volte mi allontano dal pc e quando torno indietro e digito la password, e premo invio, terminale detto CONNECTION CLOSED. ", allora perché no prevenire invece chiudere la sessione? SSH può mantenere in vita le connessioni per te.

Host Home
  User netmoon
  Port 22
  HostName test.com
  ServerAliveInterval 300
  ServerAliveCountMax 2
    
risposta data Krzysztof Jabłoński 23.03.2018 - 11:05
1

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

Potresti creare uno script, un alias o una funzione in ~/.bashrc per eseguire rapidamente quel comando.

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

    
risposta data enzotib 15.12.2011 - 13:02
0

Grazie Arek per l'ispirazione ...

Invece di eseguire un altro processo shell questa è solo una funzione in esecuzione nella shell bash corrente. Esegue singolo awk per analizzare il file di configurazione e capire se prendere la password da una variabile di shell o dalla password scritta nel file di configurazione di ssh (con awk in un eval invece di descrivere a causa di problemi che ho riscontrato usando descrivere). Ho provato tanti modi di usare sshpass direttamente in un file di configurazione ssh usando ProxyCommand ma nulla sembrava funzionare come previsto, tranne quando potevo accedere a una casella tramite rsa, ma poi dovevo inviare una password per aprire la mia directory criptata. Tuttavia la mia funzione di sotto 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\",\; exit 1 } /#[Pp]assword / && inhost { printf \"password=%s\",\; } /^[Hh]ost / && inhost { inhost=0; exit 1 } /^[Hh]ost $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 sezione ~/.ssh/config assomiglia a questa:

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

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

Enjoy!

    
risposta data 28.09.2018 - 16:07
0

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

  • l' host può essere ovunque nella riga di comando ssh ; Supporta anche la sintassi ssh <args> <host> <commands>
  • non codifica il percorso in ssh
  • analisi più efficace di ssh_config
  • Bonus: wrapper per scp , anche

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 "[email protected]")


if [ "$password" ]; then
    sshpass -p "$password" "$(which ssh)" "[email protected]"
else
    "$(which ssh)" "[email protected]"
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 "[email protected]")


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

Installazione

Definisci gli alias in ~/.bashrc :

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

Configurazione

Con la direttiva IgnoreUnknown , ssh non si lamenta di una direttiva Password introdotta di recente, quindi (al contrario della risposta di @ ArekBurdach), possiamo farlo apparire come una configurazione "reale". Se non ti piace, è banale cambiare lo script in quello con commento.

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

Host foohost
    User baruser
    Password foobarpassword
    
risposta data Ingo Karkat 31.01.2017 - 16:44
0

Se non hai accesso diretto alla coppia di chiavi, puoi crittografare la password sul tuo computer locale.

Il modo per farlo è cripta la tua password utilizzando la chiave oltre a ProxyCommand di @Eric Woodruff.

Un modo per combinare sta usando 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
    
risposta data Willian Z 02.04.2018 - 05:14

Leggi altre domande sui tag