Needed automatic upkeep of SSH-tunnels. This script can be used to start SSH-tunnels at boot and also to keep them up by running service ssh-tunnels start periodically from example cron.
Here is the init.d-script itself:
/etc/init.d/ssh-tunnels
#!/bin/bash ################################################# ################################################# # NOTE: Usually don't touch anything here # # rather modify /etc/ssh-tunnels.conf # ################################################# ################################################# # start or stop start=0 stop=0 # files CONF="/etc/ssh-tunnels.conf" # parse rules do_tunnels() { # get process information to identify already running tunnels processes=`ps axo cmd | grep ssh` echo "read tunnel definitions from $CONF..." while read line; do if [ "${#line}" -lt "1" ]; then continue fi if [ "${line:0:1}" == "#" ]; then continue fi i=0 for x in $line; do if [ "$i" -eq "0" ]; then host=$x elif [ "$i" -eq "1" ]; then user=$x elif [ "$i" -eq "2" ]; then port_local=$x elif [ "$i" -eq "3" ]; then port_remote=$x fi i=$((i+1)) done if [ "$i" -lt "3" ]; then echo "invalid rule: $line" continue fi cmd="ssh -y -f -4 -N $user@$host -L $port_local:localhost:$port_remote" running=`ps axo pid,cmd | grep "$cmd" | grep --invert-match grep` if [ "$running" == "" ]; then if [ "$start" == "1" ]; then echo "Tunnel DOWN, start tunnel ($cmd)..." $cmd else echo "Tunnel DOWN ($cmd)..." fi else if [ "$stop" == "1" ]; then echo "Tunnel UP, stop tunnel ($cmd)..." pid=`echo $running | awk '{print $1;}'` kill $pid if [ "$start" == "1" ]; then echo "Restart tunnel ($cmd)..." $cmd fi else echo "Tunnel UP ($cmd)..." fi fi done < $CONF } case "$1" in start) start=1 do_tunnels ;; stop) stop=1 do_tunnels ;; restart) stop=1 start=1 do_tunnels ;; status) stop=0 start=0 do_tunnels ;; esac
Simple config for this script:
/etc/ssh-tunnels.conf
# # Will do something like this: # ssh -y -f -4 -N <user>@<host> -L <local port>:localhost:<remote port> # # Will also check if the tunnel is already up. # # host user local port remote port server2.tldr.fi root 3307 3306 server2.tldr.fi root 27017 27017
Remember to add example symbolic link to /etc/rc2.d/ to automatically start those tunnels at startup and something like this to example /etc/cron.hourly/sshtunnels to keep them up always:
/etc/cron.hourly/sshtunnels
#!/bin/bash # # start ssh-tunnels if they are down # service ssh-tunnels start