Você pode realizar todo o processamento de texto com uma única invocação do AWK, simplificada, pois você só se importa com o encaminhamento:
#!/bin/sh
awk '/^Host / { host = $2 } host && /(Remote|Local|Dynamic)Forward/ { port=$2; gsub(".*:", "", port); print host, port }' ~/.ssh/config | while read host port; do
nc -z 127.0.0.1 "${port}" || ssh -fqN "${host}" > /dev/null 2>&1
done
Escrito com mais legibilidade, o script AWK é
/^Host / { host = $2 }
host && /(Remote|Local|Dynamic)Forward/ {
port=$2; gsub(".*:", "", port); print host, port
}
Isso armazena o host sempre que ele vê uma instrução "Host" e, em linhas encontradas enquanto um host válido é definido, e correspondendo a uma das instruções "Forward" aceitas, recupera a porta de destino, descarta a parte antes de dois pontos se any e gera o host e a porta:
localsocksdynamic 8080
localwebserverremote 8080
indirectaccesslocal 2222
Isso é então alimentado em um loop while
read
para verificar a porta e executar o SSH.