2016-02-05 4 views
0

J'écris un programme dans Go qui doit appeler ssh en tant que sous-processus, mais une fois la connexion établie, utilisez-la pour d'autres choses. J'essaie de comprendre comment vérifier si la connexion a été correctement configurée. Le problème est que je ne peux pas attendre le code de sortie, car la commande ne se termine pas avant une connexion réussie, mais si je n'attends pas, alors il est possible que je casse le processus et fasse d'autres choses, mais ensuite le sous-processus rencontrera une erreur et mourra. Ce dont j'ai besoin, c'est d'un moyen de savoir que, après un certain point, la connexion a été établie avec succès. Par exemple, une option consisterait à faire établir la connexion par ssh, puis, après l'avoir établie, à diviser le processus propriétaire de la connexion et à renvoyer le processus principal avec un code de succès. Cependant, je ne peux pas comprendre si ssh permet ce genre de comportement.Lancer la connexion SSH mais vérifier l'état?

+0

Y at-il une raison que vous n'utilisez pas le [paquet ssh] (https://godoc.org/golang.org/x/ crypto/ssh)? – user3591723

+0

Oui - il s'agit d'un outil utilisateur qui doit être capable de lire les configurations ssh globales et locales normales, prendre des drapeaux de ligne de commande, etc. Il est * plus * facile pour moi d'appeler le binaire ssh pour cela. – joshlf

+0

Etrange de dire que c'est plus facile quand vous avez déjà rencontré un problème aussi basique. Il semble beaucoup plus facile de donner à votre programme ses propres config/flags qui sont appropriés pour ce qu'il fait et de ne pas dépendre de l'utilisateur ayant le binaire ssh quelque part qui est accessible à votre programme ainsi que la version appropriée. – user3591723

Répondre

0

Compris. En particulier, j'utilise le multiplexage de connexion "ControlMaster", un processus ssh agissant comme un maître qui maintient la connexion ssh ouverte, et permet aux autres connexions de multiplexer les flux sur la connexion.

Tout d'abord, faire:

ssh -o ControlMaster=yes -o ControlPath=/path/to/socket -o ControlPersist=yes \ 
    [email protected] true 

L'important est ici que ControlPersist=yes dit ssh de continuer à fonctionner en arrière-plan, même après que le flux de connexion principale est fermée. L'exécution de true sur le serveur distant provoque la connexion, l'exécution d'une commande et le retour. Une fois que cela se produit, si cela a réussi, ssh retournera avec un code de sortie réussi.

Ensuite, vous pouvez vous connecter en utilisant les processus ssh non-maître:

ssh -o ControlMaster=no -o ControlPath=/path/to/socket [email protected] ...