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.
É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.
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.
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, 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.
Il existe également un programme sshpass
pour cela. Comment utiliser: sshpass -p MyPa55Word ssh [email protected]
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?).
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
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
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.
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
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.
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!
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
où
Host real-destination
Hostname test.com
User netmoon
Voici ma variante élaborée de la réponse de @ ArekBurdach. Il offre les extensions suivantes:
ssh
; c'est-à-dire qu'il prend également en charge la syntaxe ssh <args> <Host> <commands>
ssh
ssh_config
scp
, aussissh-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
Définissez les alias dans votre ~/.bashrc
:
alias ssh=ssh-wrapper
alias scp=scp-wrapper
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