Pouvez-vous définir des mots de passe dans .ssh / config pour permettre la connexion automatique?

75

J'utilise Ubuntu 11.10. J'utilise ssh pour me connecter quotidiennement à plusieurs serveurs. Je mets donc leurs paramètres dans le fichier .ssh/config ; comme ceci:

Host Home
User netmoon
Port 22
HostName test.com

Y at-il un moyen de mettre des mots de passe dans ce fichier, pour chaque connexion? Ainsi, lorsque le serveur demande le mot de passe, le terminal met sa passe et l’envoie au serveur.

C'est parce que parfois je m'éloigne du PC et quand je reviens en arrière, tapez mot de passe et appuyez sur Entrée, le terminal dit CONNECTION CLOSED.

  • Je ne souhaite pas utiliser de paire de clés publique / privée.
posée Netmoon 15.12.2011 - 12:36
la source

12 réponses

47

Échanger la sécurité pour plus de commodité ne se termine jamais bien ...

Pourriez-vous utiliser ssh-copy-id du package openssh-client ?

De 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.
    
réponse donnée waltinator 20.12.2011 - 04:50
la source
24

Si vous ne voulez pas vraiment utiliser une paire de clés publique / privée, vous pouvez écrire un script expect pour saisir automatiquement le mot de passe en fonction de l'adresse de destination.

Modifier: Ce que je veux dire, c’est que vous pouvez avoir un script qui, d’une part, utilise expect pour saisir le mot de passe pour vous et, d’autre part, lit le mot de passe d’un utilisateur et d’un hôte donnés à partir d’une configuration. fichier. Par exemple, le script python suivant fonctionnera pour le scénario de journée ensoleillée:

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

et le format du fichier de configuration serait le suivant:

[user_1]
host1 = passwd_1
host2 = passwd_2

[user_2]
host1 = passwd_1
host2 = passwd_2

Remarque: comme expliqué, le script python devrait être beaucoup plus complexe pour gérer toutes les erreurs possibles et les messages de questions de ssh, ainsi que toutes les URL possibles (dans l'exemple, il est supposé que ce sera quelque chose comme [email protected] , mais la partie utilisateur n’est pas utilisée la plupart du temps), mais l’idée de base serait toujours la même. En recréant le fichier de configuration, vous pouvez utiliser un fichier de configuration différent ou utiliser .ssh/config et écrire votre propre code pour analyser ce fichier et obtenir le mot de passe d'un utilisateur et d'un hôte donnés.

    
réponse donnée jcollado 15.12.2011 - 14:26
la source
16

Il existe également sshpass programme pour cela. Comment utiliser: sshpass -p MyPa55word ssh [email protected]

    
réponse donnée igor 16.01.2014 - 14:58
la source
15

Non. Je crains que ce ne soit pas possible.

La seule vraie alternative est d’utiliser des clés privées, mais vous avez dit que vous ne vouliez pas (pourquoi pas?).

    
réponse donnée Caesium 15.12.2011 - 12:40
la source
14

Qu'en est-il de ProxyCommand:

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

Vous pouvez également utiliser ssh -W au lieu de nc :

ProxyCommand sshpass -pmypass ssh [email protected]%h-raw -W localhost:%p
    
réponse donnée Eric Woodruff 10.06.2015 - 19:48
la source
6

Vous pouvez créer un simple remplacement de script ssh dans / 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

Et dans votre fichier ~ / .ssh / config, vous pouvez utiliser

Host foohost
    User baruser
    #Password foobarpassword
    
réponse donnée Arek Burdach 26.09.2016 - 13:54
la source
4

J'utilise une application de VanDyke Software appelée SecureCRT .

lien

Ce n’est pas gratuit, mais à un prix très raisonnable. Je l'utilise depuis des années (fonctionnant sous Windows ou utilisant Wine) pour l'accès à distance, l'émulation de terminal et la gestion de réseaux (dispersés). Ils ont finalement publié une version native de Linux au début de 2011.

Il prend en charge les paramètres de connexion complexes (ou scripts), les mots de passe stockés (ou certificats), les sessions multiples avec onglets, etc.

.

Au démarrage, vous pouvez choisir la cible distante (et le protocole) dans une liste structurée (vue arborescente) d'ordinateurs distants (ou locaux) stockés, ou simplement créer une connexion (qui est ensuite stockée).

Je l'ai trouvé particulièrement utile pour les sites distants dotés d'une authentification avancée, de ports non standard ou de la négociation d'accès par pare-feu.

Si vous effectuez beaucoup d'accès à distance (dans le cadre de votre rôle principal), cette application justifiera ses frais dès le premier mois d'utilisation.

    
réponse donnée david6 16.12.2011 - 06:37
la source
2

En répondant à la question que vous avez posée, non, il n'est pas possible de configurer le mot de passe par défaut dans le fichier de configuration ssh.

Mais si en effet, comme vous le dites " C'est parce que parfois je m'éloigne du PC et quand je retourne en arrière et que je tape mot de passe et que j'appuie sur entrée, le terminal dit CONNECTION CLOSED. ", alors pourquoi pas empêcher la fermeture de la session à la place? SSH peut garder les connexions actives pour vous.

Host Home
  User netmoon
  Port 22
  HostName test.com
  ServerAliveInterval 300
  ServerAliveCountMax 2
    
réponse donnée Krzysztof Jabłoński 23.03.2018 - 11:05
la source
1

La réponse de @BrunoPereira à cette question montre une autre méthode pour se connecter sans entrer explicitement un mot de passe et éviter les clés ssh.

Vous pouvez créer un script, un alias ou une fonction dans votre ~/.bashrc pour exécuter rapidement cette commande.

De toute évidence, il convient de prendre en compte la sécurité pour des raisons de sécurité.

    
réponse donnée enzotib 15.12.2011 - 13:02
la source
0

Merci Arek pour l'inspiration ...

Plutôt que d'exécuter un autre processus shell, il s'agit simplement d'une fonction s'exécutant dans le shell bash actuel. Awk utilise un seul mot de passe pour analyser le fichier de configuration et déterminer si le mot de passe doit être extrait d'une variable shell ou du mot de passe en texte clair écrit dans le fichier de configuration ssh (avec awk dans un eval au lieu de décrire en raison de problèmes liés à l'utilisation de description). J'ai essayé de nombreuses façons d'utiliser sshpass directement dans un fichier de configuration ssh en utilisant ProxyCommand mais rien ne semblait fonctionner comme prévu, sauf lorsque je pouvais me connecter à une boîte via rsa mais que je devais ensuite envoyer un mot de passe pour ouvrir mon répertoire crypté. Cependant, ma fonction ci-dessous semble fonctionner pour moi dans tous les cas, même pour 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)

Ensuite, une section ~/.ssh/config ressemble à ceci:

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

Si un #Passvar existe dans la section config, cela remplace le #Password .
$MYPASS_ENVVAR est la variable d'environnement contenant votre mot de passe.

Profitez!

    
réponse donnée 28.09.2018 - 16:07
la source
0

Voici ma variante élaborée de la réponse de @ ArekBurdach. Il propose les extensions suivantes:

  • l'hôte peut figurer n'importe où dans la ligne de commande ssh ; c'est-à-dire qu'il prend également en charge la syntaxe ssh <args> <host> <commands>
  • ne code pas le chemin d'accès à ssh
  • analyse plus robuste de ssh_config
  • Bonus: wrapper pour scp aussi

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

Installation

Définissez les alias dans votre ~/.bashrc :

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

Configuration

Avec la directive IgnoreUnknown , ssh ne se plaint pas d'une directive Password nouvellement introduite. Par conséquent (contrairement à la réponse de @ ArekBurdach), nous pouvons le faire apparaître comme une "vraie" configuration. Si vous n'aimez pas cela, il est facile de remplacer le script par celui qui a été commenté.

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

Host foohost
    User baruser
    Password foobarpassword
    
réponse donnée Ingo Karkat 31.01.2017 - 16:44
la source
0

Si vous n'avez pas d'accès direct à la paire de clés, vous pouvez chiffrer le mot de passe sur votre ordinateur local.

Pour le faire, procédez comme suit: chiffrer votre mot de passe à l’aide de la clé , en plus de la commande Proxy de @Eric Woodruff.

Pour combiner, utilisez un tuyau:

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

Host real-destination
    Hostname test.com
    User netmoon
    
réponse donnée Willian Z 02.04.2018 - 05:14
la source

Lire d'autres questions sur les étiquettes