¿BASH Script se ejecuta como root, forma ordenada de agrupar comandos que se ejecutan como otro usuario?

¿BASH Script se ejecuta como root, forma ordenada de agrupar comandos que se ejecutan como otro usuario?

Soy consciente de que puedo ejecutar cada comando como un usuario diferente con:

su -s /bin/bash "command" - user

Pero hay varios comandos que ejecutar y estaba buscando una forma más sencilla de hacerlo que poner su en cada línea.

¿Cómo puedo decir "todos los comandos desde aquí se ejecutan como usuarioX" y luego "dejar de ejecutar comandos como usuarioX" (y continuar ejecutando el resto del script como root)?

Gracias.

Aquí está el bloque que me gustaría ejecutar como usuario diferente (actualizado a partir de la respuesta dada por @Jetchisel):

#!/bin/bash
export BORG_PASSPHRASE="SUPERSECRETPASSWORD"

su - backup-user -s /bin/bash -c '
echo "$USER $(date +%F)" |& tee /pathto/_logs/test.log
borg info               \
    /pathto/repo          \
    |& tee -a /pathto/_logs/test.log
'
info_exit=$?{PIPESTATUS[0]}

if [ ${info_exit} = "0" ]; then
echo ">> test-SUCCESS <<"
elif [ ${info_exit} = "1" ]; then
echo ">> test WARNINGS <<"
else
echo ">> test FAILED <<"
fi

Lo anterior funciona pero por dos cosas:

  1. Parece que no puedo pasar la variable de entorno que Borg normalmente recoge automáticamente: $BORG_PASSPHRASE. ¿Será esto quizás un problema de permisos entre usuarios?
  2. No parece pasar info=exit correctamente. Para una prueba, eliminé el eco que retuvo por completo, pero lo escribí mal "ech", lo cual falla. Pero el guión es un éxito independientemente.

Respuesta1

Puedes probar la -cbandera.

 OPTIONS
       -c, --command=command
            Pass command to the shell with the -c option.

Algo como

su - "$user" -s /bin/bash -c 'command1;command1;command3;.....'

O utilice nuevas líneas en lugar de ;separar los comandos.

su - "$user" -s /bin/bash -c '
  command1
  command2
  command3
  ...
'

Sólo tienes que encargarte de las comillas si necesitas citar los comandos entre comillas simples.

Respuesta2

Puede utilizar funciones en su script bash, junto concomponerlograrlo fácilmente;

#!/bin/bash

function1 () {
  echo "this is function1"
 }
function2 () {
  echo "this is function2"
}

su -c "$(typeset -f function1); function1" user1
su -c "$(typeset -f function2); function2" user2


exit 0

Coloque los comandos que desee ejecutar dentro de la función y el usuario respectivo ejecutará todos esos comandos.

NOTA:ejecutará el script como root para evitar fácilmente problemas de contraseña

sudo su -c ./script.sh

Respuesta3

Eh. Soy nuevo en StackExchange. De lo contrario, esto sería un comentario en lugar de una respuesta. No tengo representante para comentar. Así que chicos. ¡Tómalo con calma conmigo! Te recomiendo que uses ssh en lugar de su. Y recomiendo que el usuario raíz y el usuario de respaldo compartan un grupo UNIX primario común.

  1. Con ssh, la contraseña del usuario de respaldo puede cambiar y su script seguirá funcionando.
  2. Si utiliza un grupo compartido, más adelante, después de su análisis de prueba de concepto, puede migrar a una solución donde una cuenta distinta a la raíz pueda poseer y ejecutar el script. Esto tiene la ventaja de que no es necesario compartir la contraseña de root.
  3. Puede pasar variables de entorno en el comando ssh... Como: ssh bla@blah "export BORG_PASSPHRASE=\"SUPERSECRETPASSWORD\"; ./script.sh"

información relacionada