3 votos

¿Cómo conseguir que se inicie un túnel ssh cada vez que mi Mac arranca?

Estoy tratando de ejecutar un script al inicio para hacer un túnel a un host remoto sobre un puerto aleatorio.
Quiero dejar una cookie en la máquina remota para decir qué puerto he elegido.

Algo así:

# to make a record of the tunneling port on the remote host
echo $remoteport > $portfile
scp $portfile rcook@linode.richcook.net:  
# to actually do the tunnel and go into the background
ssh -n -i /Users/rcook/.ssh/id_rsa -o ExitOnForwardFailure=yes -R $remoteport:localhost:22 rcook@linode.richcook.net 
# to make a record of the tunneling port on the remote host
# keep checking if ssh is up
while ps -Awwx -o "user pid ppid pcpu pmem comm args" |  egrep -v grep |  egrep "${remoteport}:localhost"; do
       echo found
       sleep 30
done
echo finished at $(date)

Luego lo señalo desde un plist para que se ejecute al inicio.
Tengo varios problemas aquí.

  1. ¿Cómo ejecutar ssh en el inicio de sesión?
  2. ¿Cómo decirle a ssh que configure un puerto y luego mantenerlo abierto para siempre?
  3. ¿Cómo comprobar la conexión ssh para asegurarse de que sigue funcionando y restablecerla si se cae?

Sé que mi respuesta es a través de launchctl y ssh pero no consigo que todas las piezas se alineen.

FWIW, aquí está mi LaunchDaemon. No tengo ni idea de si funciona, ya que no puedo resolver los problemas de ssh primero. Esto es complicado.

root@Richards-iMac (~ ): cat /Library/LaunchDaemons/Tunneler.plist 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>EnvironmentVariables</key>
    <dict>
        <key>PATH</key>
        <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/Apple/usr/bin:/usr/local/sbin</string>
    </dict>
    <key>GroupName</key>
    <string>admin</string>
    <key>KeepAlive</key>
    <dict>
        <key>Crashed</key>
        <true/>
        <key>SuccessfulExit</key>
        <true/>
    </dict>
    <key>Label</key>
    <string>Tunneler</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/rcook/bin/linode_tunneler.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>UserName</key>
    <string>rcook</string>
</dict>
</plist>

1voto

Rich Puntos 296

Vale, nada más preguntarlo me he dado cuenta de las últimas piezas.
Para conseguir que ssh haga lo que quería, aquí está el shell script para hacer lo que quiero:

#!/usr/bin/env bash

echo $0 run on $(date)
# Just chose an arbitrary 401 value range of random numbers.  
randport=$(/usr/bin/python -S -c "import random; print random.randrange(5555,5955)")
remoteport=$randport # this way we always know what port we are using.  Fix other problems later... 

portfile=/Users/rcook/.ssh/linode_remote_port.txt

echo $remoteport > $portfile
scp $portfile rcook@linode.richcook.net:
ssh -N -n -i /Users/rcook/.ssh/id_rsa -o ExitOnForwardFailure=yes -R $remoteport:localhost:22 rcook@linode.richcook.net &

sleep 5
while ps -Awwx -o "user pid ppid pcpu pmem comm args" |  egrep -v grep |  egrep "${remoteport}:localhost"; do
       echo found
       sleep 30
done
echo finished at $(date)

Puse el launchctl script en /Library/LaunchDaemons/Tunneler.plist. De esta manera se carga al iniciar el sistema.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X