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:
- 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?
- 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 -c
bandera.
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.
- Con ssh, la contraseña del usuario de respaldo puede cambiar y su script seguirá funcionando.
- 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.
- Puede pasar variables de entorno en el comando ssh... Como: ssh bla@blah "export BORG_PASSPHRASE=\"SUPERSECRETPASSWORD\"; ./script.sh"