Tu script inicia la VPN; no la aprovisiona
Un comando de inicio necesita una conexión que ya existe y está aprobada. Separa el aprovisionamiento del control de sesión, o el script solo funcionará en tu Mac.
Escribes un script que ejecuta scutil --nc start con el nombre de la conexión, funciona en tu Mac y falla en cada máquina recién instalada de la oficina. El script no está roto. Se le pide algo que nunca pudo hacer: iniciar una conexión existente no es la misma operación que crear una.
El aprovisionamiento y el control de sesión son dos trabajos con dos responsables, y un flujo de trabajo que asuma lo contrario pasará todas las pruebas en la máquina donde se escribió.
Con qué habla realmente el comando de inicio
Un comando de control de sesión se dirige a una configuración que ya existe y que ya está aprobada. Pide al sistema que levante esa conexión con nombre, usando los ajustes del servidor, las referencias de identidad y la política que se guardaron antes. Si esos nunca se instalaron, no hay nada que iniciar.
Por eso el fallo aparece en hardware nuevo y no en el portátil del administrador. El portátil se aprovisionó hace meses por una persona que desde entonces lo ha olvidado. Piensa en el comando de inicio como un timbre que alguien cableó el trimestre pasado. Pulsarlo no es lo mismo que instalar el cableado.
Tres responsables de una configuración de VPN
Un perfil gestionado por la organización viene de la gestión de dispositivos. El perfil lleva las direcciones del servidor, la disposición de autenticación y la política que exige la organización, y el administrador de VPN es la persona que las suministra. Un script no debería reconstruir esos ajustes a partir de un nombre visible que encontró en una lista.
Una configuración de VPN personal nativa se crea mediante la API Network Extension de Apple, que cubre los protocolos IPsec e IKEv2 integrados. Es una interfaz de aplicación con un paso de guardado y una aprobación del usuario, no un comando de shell que cree en silencio cualquier tipo de túnel que distribuya un proveedor.
Un cliente de terceros es un tercer caso con su propio formato de importación, su propia herramienta de gestión y a menudo su propio asistente con privilegios. Su sesión pertenece al proceso de ese proveedor. Encontrar un servicio del sistema con un nombre similar no es prueba de que un comando del sistema controle el túnel, y asumirlo produce scripts que parecen funcionar hasta que el proveedor actualiza el cliente.
El aprovisionamiento nativo tiene un guardado y una aprobación
El modelo de Apple es cargar, modificar, guardar. Una aplicación carga las preferencias existentes antes de su primer guardado tras el arranque, cambia la configuración y luego la guarda. El guardado informa de un error cuando no puede persistir, e ignorar ese resultado convierte un fallo de aprovisionamiento en un fallo de conexión tres pasos después.
El primer guardado también exige que el usuario apruebe la aplicación. Es una frontera de seguridad deliberada, y significa que la primera ejecución en un Mac nuevo es interactiva aunque todas las conexiones y desconexiones posteriores puedan automatizarse. Planifica la primera ejecución como una tarea humana con una persona presente. Automatiza la segunda ejecución en adelante, y dilo en el runbook para que nadie prometa lo imposible. Un plan de despliegue que promete una primera ejecución totalmente desatendida promete algo que la plataforma no ofrece.
Apple también recomienda validar la compatibilidad del servidor con un perfil de configuración antes de confiar en la API. Hacer esa comprobación primero separa «el servidor no aceptará este cliente» de «el cliente nunca guardó los ajustes», que son tickets distintos para equipos distintos.
Qué puede asumir un comando de inicio repetible
Tras el aprovisionamiento, un script puede apuntar con seguridad a la conexión existente mediante la interfaz de su propietario. Dale la identidad estable de la conexión más la acción que quieres, y nada más. No debería leer una ruta de preferencias adivinada, ni asumir que el nombre que muestra el menú es único en todo el sistema.
Para conexiones nativas, una petición de sesión con nombre como scutil --nc start es una operación de control. No instala ajustes del servidor, no importa credenciales ni realiza la autorización del primer guardado. Trátala como el último paso de una cadena, nunca como la cadena entera.
Mantén los secretos fuera de los argumentos de la línea de comandos y de la salida de diagnóstico habitual. Sea cual sea el mecanismo de identidad que elija el despliegue, es en el que debe apoyarse el comando de inicio, y una contraseña pegada en el historial del shell es un hallazgo en cualquier revisión.
Dos comprobaciones de aceptación
La primera comprobación es el aprovisionamiento: toma un Mac recién instalado y demuestra que la configuración está presente, pertenece al gestor correcto y está plenamente aprobada. Hazlo antes de probar la conectividad, porque una prueba de conexión en una máquina sin aprovisionar no demuestra nada sobre el script.
La segunda comprobación es la sesión: conéctate, alcanza el recurso autorizado y desconéctate limpiamente. Ahora cada fallo tiene un responsable, y ese es el beneficio práctico de separar los dos trabajos. Un perfil ausente es un problema de entrega, un error de guardado es un problema de aprobación, un inicio de sesión rechazado es un problema de autenticación, y un tiempo de espera tras un inicio correcto es la capa de sesión. Ninguno de ellos es «el script está roto».