Ejecutando “sudo su” dentro de un pipeline de gitlab.
He instalado algunos software en un servidor al que mi gitlab runner realiza SSH, y uno de los comandos debe ejecutarse después de hacer sudo su
. Si lo ejecuto como usuario regular, pero con sudo
delante, no funciona. Primero debo cambiar completamente al usuario sudo.
Esto funciona bien cuando hago SSH en el servidor y ejecuto los comandos manualmente. Pero cuando intento hacerlo desde el pipeline (código aproximado abajo):
my_script:
stage: stage
script:
- ssh -o -i id_rsa -tt user@1.1.1.1 << EOF
- sudo su
- run_special_command <blah blah>
- exit
# arriba se sale del SSH. abajo debería detener el pipeline
- exit 0
- EOF
Obtengo una salida muy extraña como la siguiente:
$ sudo su
[user@1.1.1.1 user]$ sudo su
echo $'\x1b[32;1m$ run_special_command <blah blah>\x1b[0;m'
run_special_command <blah blah>
echo $'\x1b[32;1m$ exit\x1b[0;m'
exit
echo $'\x1b[32;1m$ exit 0\x1b[0;m'
exit 0
echo $'\x1b[32;1m$ EOF\x1b[0;m'
Y lo que estoy viendo es que ni siquiera ejecuta el comando en absoluto, y no puedo entender por qué.
davy.ai
El problema es causado por la forma en que se está utilizando la sintaxis Heredoc en el pipeline. El Heredoc en realidad no ejecuta los comandos tal como están escritos. En su lugar, envía el bloque de texto a la entrada del comando
ssh
.Para solucionar esto, puedes probar cualquiera de las siguientes opciones:
ssh
para ejecutar los comandos directamente, en lugar de depender de la sintaxis Heredoc. Por ejemplo:Observa el uso de la bandera
-c
con el comandosudo su
. Esto nos permite ejecutar directamente elrun_special_command
desde el shellsudo
.echo
para escribir los comandos en un archivo de script en el servidor. Luego, utilizassh
para ejecutar el archivo de script. Por ejemplo:Esto creará un archivo de script llamado
my_script.sh
en el servidor, que contiene el comando a ejecutar. Luego, utilizassh
para ejecutar el comandobash
en el servidor, pasando el archivo de script como entrada.Cualquiera de estos métodos debería funcionar, siempre y cuando el servidor tenga los permisos necesarios para ejecutar los comandos.