Mise en place d’un tunnel SSH avec plink
Dans notre entreprise, nous ne pouvons nous connecter au monde extérieur qu’en utilisant les ports standards. Le trafic sortant vers le port 8081 est bloqué par le pare-feu. C’est un véritable casse-tête. Nous devons publier nos bibliothèques Javascript sur une instance Nexus. Cette instance fonctionne dans le cloud sur, vous l’avez deviné, le port 8081.
Nous utilisons déjà des pipelines Jenkins pour automatiser notre flux de travail. La décision a été prise d’ajouter une nouvelle étape au pipeline : ssh-tunneling. Notre instance Jenkins est exécutée sous Windows Server 2012 R2. L’utilisation de bash pour créer un tunnel ne peut pas être réalisée. Nous avons jeté un coup d’œil à Powershell pour configurer le tunnel SSH, mais il semble que l’implémentation de SSH dans Powershell ne soit pas assez mature. Les scripts batch à la rescousse!
La plupart d’entre nous utilisent Putty pour gérer nos sessions SSH. Les gens qui font Putty font aussi plink, une interface en ligne de commande pour le back-end de Putty. En combinaison avec des fichiers batch, nous pouvons créer un tunnel SSH comme ceci:
plink -v -x -a -T -C -noagent -ssh -pw "password" -L 8081:our-nexus-instance.com:8081 [email protected]
Laissez-moi vous expliquer les différents drapeaux utilisés dans la commande ci-dessus:
- -v : montrer les messages verbeux
- -x : activer le transfert X11
- -a : activer le transfert d’agent
- -T : désactiver l’allocation pty
- -C : activer la compression
- -noagent : désactiver l’utilisation de Pageant (uniquement nécessaire lors de l’utilisation de clés SSH)
- -ssh : utiliser le protocole SSH
- -pw : fournir le mot de passe
- -L : transférer le port local vers l’adresse distante
En utilisant le drapeau -L, nous pouvons mapper un port local vers un port distant. Cela se fait en utilisant la syntaxe suivante : <localport>:<remoteAddress>:<remotePort>. Ceci est suivi par le nom d’hôte auquel nous voulons nous connecter, préfixé par le nom d’utilisateur, utilisé pour se connecter : username@remoteHost.
En insérant cette commande dans notre Jenkinsfile, nous pouvons ouvrir un tunnel vers notre instance Nexus distante :
stage('Publish') {
steps {
bat "plink -v -x -a -T -C -noagent -ssh -pw 'password -L 8081:our-
nexus-instance:8081 [email protected]"
}
}
.