¿Cómo puedo ejecutar un comando arbitrariamente complejo usando sudo sobre ssh?

Pregunta:

Tengo un sistema en el que solo puedo iniciar sesión con mi nombre de usuario (myuser), pero necesito ejecutar comandos como otro usuario (scriptuser). Hasta ahora, se me ocurrió lo siguiente para ejecutar los comandos que necesito:

ssh -tq myuser@hostname "sudo -u scriptuser bash -c \"ls -al\""

Sin embargo, si cuando intento ejecutar un comando más complejo, como [[ -d "/tmp/Some directory" ]] && rm -rf "/tmp/Some directory" , rápidamente me meto en problemas con las comillas. No estoy seguro de cómo podría pasar este comando complejo de ejemplo a bash -c , cuando \" ya delimita los límites del comando que estoy pasando (por lo que no sé cómo citar / tmp / algún directorio, que INCLUYE UN ESPACIO.

¿Existe una solución general que me permita pasar cualquier comando sin importar cuán compleja / loca sea la cita, o se trata de algún tipo de limitación que he alcanzado? ¿Existen otras soluciones posibles y quizás más legibles?

Respuesta:

Un truco que uso a veces es usar base64 para codificar los comandos y canalizarlo a bash en el otro sitio:

MYCOMMAND=$(base64 -w0 script.sh)
ssh user@remotehost "echo $MYCOMMAND | base64 -d | sudo bash"

Esto codificará el script, con comas, barras invertidas, comillas y variables dentro de una cadena segura, y lo enviará al otro servidor. ( -w0 es necesario para deshabilitar el -w0 de línea, lo que ocurre en la columna 76 de forma predeterminada). Por otro lado, $(base64 -d) decodificará el script y lo enviará a bash para que se ejecute.

Nunca tuve ningún problema con eso, sin importar cuán complejo fuera el guión. Resuelve el problema de escapar, porque no necesitas escapar de nada. No crea un archivo en el host remoto y puede ejecutar scripts muy complicados con facilidad.

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım