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


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

Host Home
User netmoon
Port 22
HostName test.com

Existe-t-il un moyen 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 reviens et que je saisis le mot de passe, et que j'appuie sur enter, le terminal dit CONNECTION CLOSED.

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

71
2017-12-15 11:36


origine


Je suis dans la même situation et je ne peux pas télécharger ma clé publique car je n'ai accès à ssh que pour svn. Si j'essaie ssh svnhost je reçois "(succès (2 2 () (edit-pipeline svndiff1 absent-entrées commit-revprops profondeur log-revprops partial-replay)))" réponse svnserve et non le shell - Uberto
Voir unix.stackexchange.com/a/83991/26493 et andre.frimberger.de/index.php/linux/… pour un moyen en utilisant SSH_ASKPASS. - Olaf Dietsche


Réponses:


Négocier la sécurité pour plus de commodité ne se termine jamais bien ...

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

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.

42
2017-12-20 03:50



Cela ne fonctionne pas si l'administrateur distant insiste pour désactiver l'autorisation de clé publique ... - tomasz
Oui, mais être réaliste sur les systèmes sous votre supervision et contrôle directs ne constitue pas un compromis. Dites, par exemple, sur une machine virtuelle vagabonde sans aucune connexion externe utilisée uniquement à des fins de développement sur un seul siège. - Scott
Insister sur la sécurité draconienne sans cause ne se termine jamais bien. - cwallenpoole
Parfois, ça se termine bien. - devth
IMHO, l'insistance de mots de passe pour l'authentification est plus risqué que non. Je définissais souvent des mots de passe souvent utilisés pour ssh en tant que variables d'environnement car je répugnais à me souvenir d'un ensemble de chaînes arbitraires. En demandant aux utilisateurs de les entrer, il suffit de leur demander d’être mal stockés. - eggmatters


Si vous ne voulez pas vraiment utiliser une paire de clés publique / privée, vous pouvez écrire un expect script pour entrer le mot de passe pour vous automatiquement 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 expect pour entrer le mot de passe pour vous et, d'autre part, lit le mot de passe 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 Jour ensoleillé:

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

Note: Comme expliqué, le script python devrait être beaucoup plus complexe pour gérer toutes les erreurs possibles et tous les messages de question de ssh et de toutes les URL possibles (dans l'exemple on suppose qu'il s'agira de 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. En recadrant le fichier de configuration, vous pouvez utiliser un fichier de configuration différent ou utiliser .ssh/config et écrivez votre propre code pour analyser ce fichier et obtenir le mot de passe pour un utilisateur et un hôte donnés.


21
2017-12-15 13:26



pouvez-vous expliquer plus loin? - Netmoon
@ Netmoon J'ai ajouté un petit exemple à ma réponse à ma question plus claire. - jcollado
Cela ne répond pas à la question de savoir comment mettre le mot de passe dans le fichier .ssh / config - Eric Woodruff
En effet, il ne répond pas à cette question. Mais cela résout le problème: évitez de taper manuellement les mots de passe et de les stocker dans un fichier. Ce qui est joli ce que nécessite OP. - Arcesilas


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

La seule alternative consiste à utiliser des clés privées mais vous avez dit que vous ne vouliez pas (pourquoi pas?).


15
2017-12-15 11:40



parce que je n'ai pas la permission de mettre une autre clé sur le serveur. - Netmoon
@Netmoon: Si vous pouvez vous connecter, vous pouvez ajouter une clé, non? Vous n’avez besoin que d’un accès en écriture à votre répertoire personnel, à moins que l’administrateur système n’établisse une configuration étrange. - Scott Severance
@ScottSeverance Je pense que c'est la situation à laquelle cette question fait référence. Ne pas avoir la possibilité d'ajouter une clé. Oui c'est étrange, mais ça arrive souvent. - user239558
J'ai eu l'expérience très commune des environnements d'hébergement partagé où l'accès à la clé publique est désactivé, alors même si vous pouvez ajouter des clés, elles ne sont pas utilisées. cela va à l'encontre de la raison oui, mais c'est la façon dont beaucoup de fournisseurs d'hébergement installent leurs serveurs - billynoah
Il y a des réponses qui montrent que c'est possible - Eric Woodruff


Il y a aussi sshpass programme pour cela. Comment utiliser: sshpass -p MyPa55word ssh me@myservor.com


15
2018-01-16 13:58



À moins que vous ne préfériez votre commande avec un espace, (sshpass au lieu de sshpass), vous venez de stocker votre mot de passe ("MyPa55word") dans le fichier d'historique de votre shell. - waltinator
@waltinator bon point - igor
Eh bien, la question était bien avec elle étant en .ssh/config, pourquoi pas dans l'histoire de la coquille aussi? - Darth Egregious
Ce n'est pas officiellement sur Homebrew mais vous pouvez l'installer à partir d'un repo tiers avec brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb. Plus: gist.github.com/arunoda/7790979 - Jacob Ford
read -s password; sshpass -p "$password" ssh me@myservor.com. Cela empêchera l'affichage du mot de passe dans l'historique - Alexander Bird


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 utiliser ssh -W au lieu de nc ainsi que:

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

12
2018-06-10 17:48



Il ne fonctionnera pas comme prévu avec -W option. Avez-vous une solution de contournement? - Toan Nguyen
Il me demande toujours le mot de passe avec cette commande proxy ... - Victor Piousbox


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

5
2017-09-26 11:54





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'ai utilisé pendant des années (sous Windows ou avec Wine) pour l'accès à distance, l'émulation de terminal et la gestion de réseau (dispersée). Ils ont finalement sorti une version Linux native de cette version début 2011.

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

Au démarrage, vous pouvez choisir la cible distante (et le protocole) d'une liste structurée (arborescence) 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 avec authentification avancée, ports non standard ou négociation d'accès au pare-feu.

Si vous faites beaucoup d’accès à distance (dans le cadre de votre rôle principal), cette application justifiera ses dépenses au cours du premier mois d’utilisation.


4
2017-12-16 05:37



désolé, je ne comprends pas. peux-tu expliquer ? - Netmoon
reformulé pour vous .. - david6
Depuis la publication de la réponse ci-dessus, il y a eu plusieurs versions de SecureCRT, y compris la dernière version de VanDyke qui a été lancée début décembre 2013. Chaque itération améliore le programme, le rendant encore plus polyvalent. Il possède également une API riche qui permet de contrôler / interfacer le programme avec les scripts Python / VB. SecureCRT fait partie de mon noyau depuis une bonne décennie et je le recommande vivement. - Ville
D'accord. Je continue à tester bêta chaque nouvelle version et je me suis beaucoup impliqué dans les premiers tests pour le portage vers Ubuntu.


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é à prendre en compte avec cette approche.


1
2017-12-15 12:02





En répondant à la question que vous avez posée, 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 reviens et que je saisis le mot de passe, et que j'appuie sur enter, le terminal dit CONNECTION CLOSED.", alors pourquoi ne pas empêcher la fermeture de la session à la place? SSH peut garder les connexions en vie pour vous.

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

1
2018-03-23 10:05





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

  • la hôte peut être n'importe où dans le ssh ligne de commande; c'est à dire qu'il supporte aussi le ssh <args> <host> <commands> syntaxe
  • ne pas coder en dur le chemin d'accès à ssh
  • analyse plus robuste de ssh_config
  • Bonus: emballage 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éfinir des alias dans votre ~/.bashrc:

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

Configuration

Avec le IgnoreUnknown directif, ssh ne se plaint pas d'un nouveau introduit Password directive, donc (contrairement à la réponse de @ ArekBurdach), nous pouvons faire en sorte que cela apparaisse comme une "vraie" configuration. Si vous n'aimez pas cela, il est trivial de remplacer le script par celui qui est commenté.

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

Host foohost
    User baruser
    Password foobarpassword

0
2018-01-31 15:44





Si vous ne disposez pas d'un 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 chiffrer votre mot de passe en utilisant la clé en plus de ProxyCommand de @Eric Woodruff.

Une façon de combiner utilise 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
2018-04-02 03:14