Bash: set up a temporary SSH tunnel

You can do this cleanly with an ssh ‘control socket’. To talk to an already-running SSH process and get its PID, kill it etc. Use the ‘control socket’ (-M for master and -S for socket) as follows:

ssh -M -S my-ctrl-socket -fnNT -L 50000:localhost:3306 [email protected]

ssh -S my-ctrl-socket -O check [email protected]
Master running (pid=3517) 

ssh -S my-ctrl-socket -O exit [email protected]
Exit request sent.

Note that my-ctrl-socket will be an actual file that is created.

You can use -o ExitOnForwardFailure=yes with -f and SSH will wait for all remote port forwards to be successfully established before placing itself in the background. You can grep the output of ps to get the PID. For example, you can use

ssh -Cfo ExitOnForwardFailure=yes -N -L 9999:localhost:5900 $REMOTE_HOST
PID=$(pgrep -f 'N -L 9999:')
[ "$PID" ] || exit 1

and be pretty sure you’re getting the desired PID