web-dev-qa-db-fra.com

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

J'utilise Ubuntu 11.10. J'utilise ssh pour me connecter quotidiennement à de nombreux serveurs, alors je mets leurs paramètres dans le fichier .ssh/config; comme ça :

Host Home
User netmoon
Port 22
HostName test.com

Est-il possible de mettre des mots de passe dans ce fichier, pour chaque connexion? Ainsi, lorsque le serveur demande un 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 retourne, tapez mot de passe, et appuyez sur Entrée, le terminal dit CONNECTION CLOSED.

  • Je ne veux pas utiliser de paire clé publique/clé privée.
87
Netmoon

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

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

De man ssh-copy-id:

ssh-copy-id est un script qui utilise ssh pour se connecter à une machine distante et ajouter le fichier d'identité indiqué au fichier ~/.ssh/registered_keys de cette machine.

54
waltinator

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

Edit: Ce que je veux dire, c’est que vous pouvez avoir un script qui, d’une part, utilise expectpour entrer le mot de passe pour vous et, d’autre part, le lit pour un utilisateur et un hôte donnés à partir d’un fichier de configuration. 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 __== '__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 user@Host , mais la partie utilisateur n’est pas utilisée la plupart du temps), mais l’idée de base serait toujours la même. Lors de la régénération du fichier de configuration, vous pouvez utiliser un autre fichier de configuration 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.

25
jcollado

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

17
igor

Non, ce n'est pas possible, j'ai bien peur.

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

16
Caesium

Que diriez-vous de ProxyCommand:

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

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

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

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

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

Host foohost
    User baruser
    #Password foobarpassword
7
Arek Burdach

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

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

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 Linux native 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) de machines distantes (ou locales) stockées, 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 (partie de votre rôle principal), cette application justifiera ses frais au cours du premier mois d'utilisation.

4
david6

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 dites "C'est parce que parfois je m'éloigne du PC et quand je retourne en arrière, tapez mot de passe et appuyez sur Entrée, le terminal dit CONNECTION CLOSED.", alors pourquoi ne pas empêcher la fermeture du session à la place? SSH peut maintenir les connexions en vie pour vous.

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

La réponse de @BrunoPereira à cette question montre une méthode alternative 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 y a des considérations de sécurité que vous devriez prendre en compte avec cette approche.

1
enzotib

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 s’il faut prendre le mot de passe d’une variable Shell ou du texte en clair écrit en texte clair dans le fichier de configuration ssh (avec awk dans un eval au lieu de décrire en raison de problèmes que j’ai utilisés à l’aide de decrire). J'ai essayé de nombreuses manières 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\",\$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)

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.

Prendre plaisir!

1
MerryDan

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.

La façon de le faire est cryptez votre mot de passe en utilisant la clé en plus de @Eric Woodruff's ProxyCommand.

Une façon de combiner est d'utiliser 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
0
Willian Z

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

  • le hôte peut être 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 pas coder en dur 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 "$@")


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

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 récemment introduite, donc (contrairement à la réponse de @ ArekBurdach), nous pouvons la 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
0
Ingo Karkat