Een SSH-tunnel opzetten met plink
In ons bedrijf kunnen we alleen verbinding maken met de buitenwereld via de standaard poorten. Uitgaand verkeer naar poort 8081 wordt geblokkeerd door de firewall. Dit is echt een lastige situatie. Wij moeten onze Javascript bibliotheken publiceren naar een Nexus instantie. Deze instance draait in de cloud op, je raadt het al, poort 8081.
We gebruiken al Jenkins pipelines om onze workflow te automatiseren. Er is besloten om een nieuwe stap aan de pijplijn toe te voegen: ssh-tunneling. Onze Jenkins instance draait op Windows Server 2012 R2. Het gebruik van bash om een tunnel te creëren is niet haalbaar. We hebben gekeken naar Powershell om de SSH tunnel op te zetten, maar het lijkt erop dat de implementatie van SSH in Powershell niet volwassen genoeg is. Batch scripts zijn de redding!
De meesten van ons gebruiken Putty om onze SSH-sessies af te handelen. De mensen die Putty maken, maken ook plink, een command-line interface voor de Putty back-end. In combinatie met batch bestanden kunnen we een SSH-tunnel als deze maken:
plink -v -x -a -T -C -noagent -ssh -pw "password" -L 8081:our-nexus-instance.com:8081 [email protected]
Laat me de verschillende vlaggen uitleggen die in het bovenstaande commando gebruikt worden:
- -v : toon verbose berichten
- -x: schakel X11 forwarding in
- -a: schakel agent forwarding in
- -T: schakel pty toewijzing uit
- -C: schakel compressie in
- -noagent: schakel het gebruik van Pageant uit (alleen nodig bij gebruik van SSH-sleutels)
- -ssh: gebruik het SSH-protocol
- -pw: geef het wachtwoord
- -L: stuur een lokale poort door naar een adres op afstand
Met de -L vlag kunnen we een lokale poort toewijzen aan een poort op afstand. Dit wordt gedaan met de volgende syntaxis: <localport>:<remoteAddress>:<remotePort>. Dit wordt gevolgd door de hostnaam waarmee we willen verbinden, voorafgegaan door de gebruikersnaam, gebruikt om te verbinden: username@remoteHost.
Door dit commando in ons Jenkinsfile in te voegen, kunnen we een tunnel openen naar onze Nexus instantie op afstand:
stage('Publish') {
steps {
bat "plink -v -x -a -T -C -noagent -ssh -pw 'password -L 8081:our-
nexus-instance:8081 [email protected]"
}
}