Háttérbe küldött ssh PID elkapása

Szeretnék írni egy egyszerű scriptet ami nyit egy SSH tunnelt egy Bastion hoston, majd futtat egy helyi processt, végül leállítja az SSH sessiönt és ezáltal a tunnelt. Nehezítésképp az SSH sessiont csak interaktívan tudom elindítani, nincs lehetőség private key vagy egyéb, nem interaktív használatra. Első körben egy ehhez hasonló scriptet raktam össze, a példa kedvéért a helyi process a curl:

#!/bin/sh

if ssh -fNL localhost:8080:private.example.com:80 bastion.example.com; then
  SSH_PID=$!

  curl http://localhost:8080

  kill $SSH_PID
fi

Ez nyilván nem működik, egyrészt az SSH_PID üres lesz, másrészt ha kapna is értéket az legfeljebb a fork() előtti process-é lenne, ami már nem fut.

Ezután módosítottam a scriptet:

#!/bin/sh

ssh -NL localhost:8080:private.example.com:80 bastion.example.com &
SSH_PID=$!

curl http://localhost:8080

kill $SSH_PID

Ezzel meg az a probléma, hogy nem várja meg míg sikerül az authentikáció.

Ezen a ponton az egyetlen megoldás ami eszembe jutott, hogy az első variánst használom és lsof-fel szerzem meg az ssh process PID-jét, de hátha van ennél egyszerűbb és szebb megoldás is.

A kérdés tehát, hogy ezt ti hogyan oldanátok meg?

Hozzászólások

ssh master mode-nak, control socket-nek és az 'exit' control command-nak olvass utána, azokkal a pid ismerete nélkül is el lehet érni, amit szeretnél.

Így sikerült megoldanom:

#!/bin/sh

if ssh -fNL localhost:8080:private.example.com:80 -MS '~/.ssh/controlmasters/%C' bastion.example.com; then
  curl http://localhost:8080

  ssh -S '~/.ssh/controlmasters/%C' -O stop bastion.example.com
fi

Természetesen ezen lehet még javítani, pl. trap használata a stop küldésére.

Expect szkripttel automatizálni tudnád a feladatot (https://linux.die.net/man/1/expect illetve https://hostadvice.com/how-to/how-to-automate-tasks-in-ssh/). Az expect szkriptben az exp_pid -del le tudod kérni az ssh PID -jét. Fork -kal vagy overlay -jel el tudod indítani a culrl -t, majd az elmentett PID -del lelőni az SSH -t. Ez csak egy ötlet, a probléma sokféle módon megoldható a progival, a részleteket rád bízom ;)

Egyaltalan miert kell hatterben futtatni az ssh-t? Ugyis csak arra hasznalod, hogy az adott hosztrol letults egy oldalt, akkor miert nem lehet az oldalt rogton a hoszton letolteni?

ssh bastion.example.com curl http://localhost:80