Utiliser un canal SSH déjà établi

50

J'ai une connexion ssh déjà établie entre deux machines.

Existe-t-il un moyen d'envoyer des commandes à la machine distante à partir d'un script shell exécuté sur la machine locale, à l'aide de la connexion déjà ouverte et sans démarrer une autre session ssh?

SWeko
la source

Réponses:

56

C'est très simple avec des versions assez récentes d'OpenSSH si vous planifiez à l'avance.

Ouvrez une connexion principale la première fois. Pour les connexions suivantes, acheminez les connexions esclaves via la connexion maître existante. Dans votre ~/.ssh/config, configurez le partage de connexion pour qu'il se produise automatiquement:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Si vous démarrez une session ssh avec la même connexion (utilisateur, port, machine) qu'une connexion existante, la seconde session sera tunnelée sur la première. L'établissement de la deuxième connexion ne nécessite aucune nouvelle authentification et est très rapide.

Gilles, arrête de faire le mal
la source
Il semble que le second ne sera pas enregistré dans / var / log / secure ou /var/log/auth.log. Cependant, le second sera-t-il enregistré dans / var / log / wtmp?
SOUser
@XichenLi /var/log/secureet /var/log/auth.logjournaliser les connexions SSH; une connexion esclave n'y apparaît pas car elle se greffe sur une connexion existante. Si votre session ssh alloue un terminal (c'est- ssh somehostà- dire sans commande fournie ssh -t) ou , qui est (normalement) connecté wtmp, quelle que soit l'apparence de ce terminal (quelle que soit la méthode utilisée pour établir la connexion, l'application de l'émulateur de terminal,…).
Gilles 'SO- arrête d'être méchant'
2
Vous pouvez également utiliser ControlPersist 600un délai en secondes avant que le socket ne soit inactif avant d'être automatiquement supprimé. Sinon, il se fermera automatiquement à la fin de la connexion principale. Ce n'est pas bon pour exécuter une série de commandes à distance (par exemple une série de commandes rsync dans différents dossiers)
2
Si vous ne souhaitez pas modifier la configuration globale, vous pouvez également utiliser les options -S(spécifier le socket) et -M(créer une connexion maître) du client SSH.
yankee
22

C'est assez facile à réaliser en utilisant l' outil nc et les tunnels ssh.

1. tunnel ssh ouvert

Dans votre session SSH, tapez ~Csur une nouvelle ligne. Vous obtiendrez l'invite ssh "service console" qui ressemble à ceci:

ssh> 

Tapez la commande de transfert local pour ouvrir un tunnel ssh:

ssh> -L22000:targethost:22001
Forwarding port.

targethostest le nom d'hôte ou l'adresse IP de la machine à laquelle vous êtes connecté.

Maintenant, en supposant que le serveur ssh de la machine cible n’ait pas été configuré pour interdire les tunnels, vous disposez du transfert de connexion souhaité: le sshclient de votre machine écoute le port 22000 et transfère le trafic qui lui est envoyé sur le port 22001 targethost.

2. Démarrer un serveur de réseau sur la machine distante

C'est aussi simple que d'entrer dans votre session ssh déjà ouverte la commande suivante:

remote$ nc -l localhost 22001 | sh

Cela démarrera un serveur TCP à l'écoute sur le port 22001 - qui est le port cible de notre tunnel ssh - et acheminera les données reçues (vraisemblablement des commandes shell) vers une targethostinstance shell.

3. Envoyez votre script par le tunnel

local$ cat yourscript.sh | nc localhost 22000

Ceci enverra le corps du script à votre tunnel ssh et sera exécuté dans un shell sur le targethost. Vous verrez la sortie du script dans votre terminal avec une session ssh.


Je noterai également que le tunnel ssh (étape 1) de ce scénario n'est pas strictement requis; Vous pouvez également démarrer le serveur et vous y connecter directement via Internet. Cependant, vous devrez utiliser le tunnel si l'hôte cible ne peut pas être atteint directement (par exemple derrière un NAT) ou si le cryptage SSH est souhaité.

Ulidtko
la source
3
Très bonne réponse. Techniquement, pour accéder à la console de service, le ~caractère doit être placé après une nouvelle ligne, ce qui en LF ~ Cfait probablement une meilleure séquence.
Alexios
@Alexios, correct.
ulidtko
Truc incroyable! Pour mémoire, la page de manuel ssh donne quelques informations supplémentaires à ce sujet (faites défiler vers le bas pour accéder à la section intitulée "PERSONNES ESCAPEAUTIQUES")
Carles Sala
@CarlesSala est également bon de savoir que less, le pageur par défaut commun, prend en charge la recherche, ce qui peut vous faire économiser du défilement si vous connaissez vos mots-clés: man ssh /ESCAPEil vous suffit de taper et vous y êtes.
ulidtko
@ulidtko bien sûr, mais autant que je sache, on ne peut pas lier une commande CLI à un commentaire SO, alors j'ai trouvé la page de manuel html une meilleure option ;-)
Carles Sala