Einrichten eines SSH-Tunnels mit plink
In unserer Firma können wir uns nur über die Standardports mit der Außenwelt verbinden. Ausgehender Verkehr an Port 8081 wird von der Firewall blockiert. Das ist ein echtes Ärgernis. Wir müssen unsere Javascript-Bibliotheken in einer Nexus-Instanz veröffentlichen. Diese Instanz läuft in der Cloud auf, Sie ahnen es, Port 8081.
Wir verwenden bereits Jenkins-Pipelines, um unseren Workflow zu automatisieren. Es wurde beschlossen, der Pipeline einen neuen Schritt hinzuzufügen: ssh-tunneling. Unsere Jenkins-Instanz läuft unter Windows Server 2012 R2. Die Erstellung eines Tunnels mit bash ist nicht möglich. Wir haben einen Blick auf Powershell geworfen, um den SSH-Tunnel einzurichten, aber es scheint, dass die Implementierung von SSH in Powershell nicht ausgereift genug ist. Batch-Skripte zur Rettung!
Die meisten von uns verwenden Putty zur Verwaltung ihrer SSH-Sitzungen. Die Macher von Putty stellen auch plink her, eine Kommandozeilenschnittstelle zum Putty-Backend. In Kombination mit Batchdateien können wir einen SSH-Tunnel wie folgt erstellen:
plink -v -x -a -T -C -noagent -ssh -pw "password" -L 8081:our-nexus-instance.com:8081 [email protected]
Lassen Sie mich die verschiedenen Flags erklären, die im obigen Befehl verwendet werden:
- -v: zeige ausführliche Meldungen
- -x: aktiviere X11-Weiterleitung
- -a: aktiviere Agent-Weiterleitung
- -T: deaktiviere Putty-Zuweisung
- -C: Komprimierung aktivieren
- -noagent: Verwendung von Pageant deaktivieren (nur bei Verwendung von SSH-Schlüsseln erforderlich)
- -ssh: SSH-Protokoll verwenden
- -pw: Passwort angeben
- -L: Lokalen Port an entfernte Adresse weiterleiten
Mit dem Flag -L kann ein lokaler Port einem entfernten Port zugeordnet werden. Dies geschieht mit der folgenden Syntax: <localport>:<remoteAddress>:<remotePort>. Danach folgt der Hostname, mit dem wir uns verbinden wollen, mit dem vorangestellten Benutzernamen: username@remoteHost.
Durch Einfügen dieses Befehls in unsere Jenkins-Datei können wir einen Tunnel zu unserer entfernten Nexus-Instanz öffnen:
stage('Publish') {
steps {
bat "plink -v -x -a -T -C -noagent -ssh -pw 'password -L 8081:our-
nexus-instance:8081 [email protected]"
}
}