Creé un archivo plist para reemplazar un proceso xinetd que usé con éxito en Windows (Cygwin) y Linux para transmitir una conexión imapd desde un servidor remoto a través ssh
de un puerto en el host local.
El plutil
comando dice que mi configuración está bien. launchctl load path-to-plist
se ejecuta sin errores.
Cuando ejecuto launchctl list
el agente no se muestra. Cuando intento conectarme al puerto en el host local, se rechaza la conexión.
Aquí está mi archivo 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>Label</key>
<string>com.my.ssh_tunnel</string>
<key>Program</key>
<string>/usr/bin/ssh</string>
<key>ProgramArguments</key>
<array>
<string>-F /Users/userx/.ssh/config</string>
<string>dname /usr/sbin/imapd</string>
</array>
<key>Sockets</key>
<dict>
<key>Listeners</key>
<dict>
<key>SockServiceName</key>
<string>dname-imapd</string>
<key>SockType</key>
<string>stream</string>
<key>SockProtocol</key>
<string>TCP</string>
</dict>
</dict>
<key>inetdCompatibility</key>
<dict>
<key>Disabled</key>
<false/>
<key>Wait</key>
<false/>
</dict>
<key>EnvironmentVariables</key>
<dict>
<key>SSH_AUTH_SOCK</key>
<string>/Users/userx/.ssh-agent.sock</string>
</dict>
</dict>
</plist>
He agregado una línea a /etc/services para dname-imapd y un puerto no asignado (49022). En última instancia, usaré esto junto con ssh-agent (para que funcione 'sin contraseña') y Thunderbird para recuperar el correo de un sistema muy bloqueado.
Hay esencialmente dos preguntas aquí. Uno, ¿cómo sé que mi agente se está cargando (y cómo lo confirmo)? Dos, ¿mi plist es realmente correcto?
Aquí está mi configuración original de xinetd :
service imapssh
{
disable = no
type = UNLISTED
port = 2208
socket_type = stream
protocol = tcp
wait = no
server = /usr/bin/ssh
server_args = dname /usr/sbin/imapd
user = userx
}
Gracias por cualquier ayuda. Esto me está volviendo un poco loco.
Esto está en un El Capitán Macbook Pro.
Además, probé un túnel ssh directo pero eso realmente no funciona (antes de que alguien lo sugiera). A menos que alguien sepa cómo hacerlo funcionar como inetd y generar cada vez que el cliente de correo se conecta al puerto.
De acuerdo, primero aborde su segunda pregunta (¿ mi plist es realmente correcta? ), plutil
(en su invocación predeterminada) "lints" (verifica) plist
archivos para ver si son correctos:
plutil ~/Library/LaunchAgents/local.brew.update.plist
Equivalente a:
plutil -lint ~/Library/LaunchAgents/local.brew.update.plist
Volviendo a su primera pregunta (¿ cómo sé que mi agente se está cargando (y cómo lo confirmo)? ), aquí hay algunas cosas para ayudar a verificar eso.
Primero, recomendaría agregar el registro para ayudar a la depuración. Me conecto a ~/Library/Logs
, así que agregue algo como esto a mi plist
:
<key>StandardOutPath</key>
<string>/Users/userx/Library/Logs/local.brew.update.stdout</string>
<key>StandardErrorPath</key>
<string>/Users/userx/Library/Logs/local.brew.update.stderr</string>
Intente volver a cargar su plist
y luego verifique sus registros:
less ~/Library/Logs/local.brew.update.stdout
less ~/Library/Logs/local.brew.update.stderr
Algunas observaciones adicionales:
Según tengo entendido inetdCompatibility
, el agente debe iniciarse cuando se carga. Sin embargo, dices que eso launchctl list
no muestra al agente. ¿Eso cambia si lo intentas launchctl start com.my.ssh_tunnel
después de cargar el archivo plist
? ¿Los registros muestran algo nuevo?
No entiendo completamente la relación entre Program
y ProgramArguments
- podría ser solo yo, pero encuentro man launchd.plist
la explicación de ProgramArguments
difícil. Me inclinaría a intentar agregar /usr/bin/ssh
como primer string
lugar ProgramArguments
y eliminar la entrada para Program
. (Luego vuelva a cargar y verifique los registros. Reinicie y verifique los registros si es necesario).
Finalmente, estoy bastante seguro de que @ daniel-Azuelos es correcto, y debe especificar su ProgramArguments
gusto (lo agregué usr/bin/ssh
como se mencionó anteriormente):
<key>ProgramArguments</key>
<array>
<string>/usr/bin/ssh</string>
<string>-F</string>
<string>/Users/userx/.ssh/config</string>
<string>dname</string>
<string>/usr/sbin/imapd</string>
</array>
Mi razonamiento para esto es que los pocos plist
s que puedo encontrar en mi sistema que usan (más de uno) ProgramArguments
usan este modismo:
<key>Label</key>
<string>com.divx.uninstall.preferences</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>-c</string>
<string>if [[ ! -e "/Applications/DivX/DivX Preferences.app" ]] ; then open "/Library/Application Support/DivX/Uninstall DivX for Mac.app"; fi</string>
</array>
Observe cómo bash
la opción de -c
y la correspondiente command_string
están en argumentos separados.
dan
ProgramArguments
debe dividirse en 4<string>…</string>
, uno para cada unoargv[i]
, como<string>-F</string>…
.mrmacross