Cambiar la contraseña del admin de DirectAdmin desde la consola
Cómo cambiar la contraseña del usuario admin de DirectAdmin desde la consola del servidor, de forma segura y comprobando que el cambio funciona.
Por qué no basta con lo que dicen muchas guías
Muchas guías de Internet resuelven esto con passwd admin. Ese comando cambia la contraseña del usuario del sistema operativo, pero no es el mecanismo del panel: en nuestros servidores, con versiones actuales de DirectAdmin, no sirve para entrar en el panel con la contraseña nueva. Y la herramienta de línea de comandos de DirectAdmin (da) no tiene ninguna orden para cambiar contraseñas.
El camino que sí funciona es el del propio panel: su API, con la llamada CMD_API_USER_PASSWD. Es la misma operación que haces desde la interfaz web, pero lanzada desde la consola.
Tampoco sirve entrar con un enlace de acceso directo (da login-url) para cambiarla desde la web: el formulario de contraseña pide la actual, que es justo la que no tienes.
Lo que hace el script
- Pide la contraseña nueva dos veces, sin mostrarla en pantalla y sin que quede en el historial.
- Si está vacía o las dos no coinciden, sale sin tocar nada.
- Cambia la contraseña a través de la API del panel.
- Comprueba que se puede entrar con la contraseña nueva.
- No deja la contraseña en ningún fichero ni en la línea de comandos: los ficheros temporales se crean con permisos solo de root y se borran al terminar.
Funciona con contraseñas que lleven símbolos (&, +, =, comillas…).
Uso
Como root en el servidor:
- Crea el fichero
/root/da-admin-passwd.shcon el contenido del final de esta página. - Ejecútalo:
bash /root/da-admin-passwd.sh
Debe responder dos cosas:
Respuesta del panel:conerror=0.Prueba de login con la nueva: HTTP 200. Si saleHTTP 401, el cambio no se aplicó.
No pegues el código en la consola
Ejecuta el script como fichero. Si pegas el bloque directamente en la consola, las órdenes que piden la contraseña se quedan con las líneas siguientes del pegado como si fueran lo que has tecleado, y el resultado es imprevisible. Si ya te ha pasado y la consola se ha quedado con un > esperando, pulsa Ctrl+C.
Si el servidor forma parte de un cluster DNS
Si este servidor recibe zonas DNS de otros servidores DirectAdmin (cluster DNS), esos otros guardan la contraseña del admin de este en su configuración del cluster. Al cambiarla, actualízala también allí; si no, dejarán de poder enviarle zonas.
El script
#!/bin/bash
# Change the DirectAdmin admin password through the panel API.
# Run as root on the DA host: bash /root/da-admin-passwd.sh
# The password is read hidden, never echoed, never placed on a command line.
set -u
umask 077
read -rsp "Nueva contraseña admin: " P1; echo
read -rsp "Repítela: " P2; echo
if [ -z "$P1" ] || [ "$P1" != "$P2" ]; then
echo "Vacía o no coinciden. No cambio nada."; exit 1
fi
T=$(mktemp -d)
trap 'rm -rf "$T"' EXIT
P="$P1" python3 -c 'import os,urllib.parse as u;p=os.environ["P"];print(u.urlencode({"username":"admin","passwd":p,"passwd2":p}),end="")' > "$T/body"
R=$(curl -sk "$(da api-url --user=admin)/CMD_API_USER_PASSWD" --data @"$T/body")
echo "Respuesta del panel: $(printf '%s' "$R" | python3 -c 'import sys,urllib.parse as u;print(u.unquote_plus(sys.stdin.read()))')"
PORT=$(da config-get port)
P="$P1" python3 -c 'import os;print("user = \"admin:%s\"" % os.environ["P"].replace("\\","\\\\").replace("\"","\\\""))' > "$T/cfg"
curl -sk -K "$T/cfg" -o /dev/null -w "Prueba de login con la nueva: HTTP %{http_code}\n" "https://127.0.0.1:${PORT}/CMD_API_LOGIN_TEST"
Requisitos: DirectAdmin con la orden da (versiones actuales), curl y python3, que vienen en cualquier instalación estándar.