Ustawianie tunelu SSH przy użyciu plink
W naszej firmie możemy łączyć się ze światem zewnętrznym tylko przy użyciu standardowych portów. Ruch wychodzący na port 8081 jest blokowany przez firewall. Jest to prawdziwy ból w dupie. Musimy opublikować nasze biblioteki Javascript do instancji Nexusa. Ta instancja działa w chmurze na, jak się domyślacie, porcie 8081.
Używamy już potoków Jenkinsa do automatyzacji naszego przepływu pracy. Podjęliśmy decyzję o dodaniu nowego kroku do potoku: ssh-tunneling. Nasza instancja Jenkinsa działa w systemie Windows Server 2012 R2. Użycie basha do stworzenia tunelu nie jest możliwe. Spojrzeliśmy na Powershell, aby skonfigurować tunel SSH, ale wydaje się, że implementacja SSH w Powershell nie jest wystarczająco dojrzała. Skrypty wsadowe na ratunek!
Większość z nas używa Putty do obsługi naszych sesji SSH. Ludzie, którzy stworzyli Putty, stworzyli również plink, interfejs wiersza poleceń do back-endu Putty. W połączeniu z plikami wsadowymi możemy stworzyć tunel SSH w ten sposób:
plink -v -x -a -T -C -noagent -ssh -pw "password" -L 8081:our-nexus-instance.com:8081 [email protected]
Pozwól mi wyjaśnić różne flagi użyte w powyższym poleceniu:
- -v : show verbose messages
- -x: enable X11 forwarding
- -a: enable agent forwarding
- -T: disable pty allocation
- -C: enable compression
- -noagent: disable use of Pageant (only needed when using SSH-keys)
- -ssh: use the SSH-protocol
- -pw: provide the password
- -L: forward local port to remote address
Używając flagi -L możemy mapować port lokalny na port zdalny. Robi się to za pomocą następującej składni: <localport>:<remoteAddress>:<remotePort>. Po tym następuje nazwa hosta, z którym chcemy się połączyć, poprzedzona nazwą użytkownika, używaną do połączenia: username@remoteHost.
Wstawiając to polecenie do naszego pliku Jenkinsfile, możemy otworzyć tunel do naszej zdalnej instancji Nexusa:
stage('Publish') {
steps {
bat "plink -v -x -a -T -C -noagent -ssh -pw 'password -L 8081:our-
nexus-instance:8081 [email protected]"
}
}
.