scripts script programas programacion pasar parametros español ejemplos ejecutar como comandos shell vagrant

programas - ¿Puedo cambiar de usuario en el script de shell de arranque Vagrant?



scripts bash ejemplos (4)

Encontré esto mientras buscaba una forma de ejecutar los scripts del proveedor Vagrant como no root, y me gustaría agregar una explicación para el comportamiento observado, que es un conocimiento fundamental de Unix que sería útil para que los lectores lo sepan.

La ejecución de un programa (como / bin / sh, sudo o su) en un script de shell no puede cambiar nada en el contexto (directorio de trabajo, usuario en ejecución, etc.) en el que se ejecuta, solo establece el contexto para el proceso que crea (y solo cambie el uid en ejecución si se ejecuta como root - uid 0). Esta es también la razón por la que cd es un comando incorporado en shells. su es un programa setuid (tenga en cuenta la "s" cuando pruebe el comando "ls -l which su "), lo que significa que se ejecutará como el usuario que posee el programa (raíz) en lugar de como el usuario que lo ejecuta.

Editar Aparentemente, el problema era que debería haberlo hecho.
su - postgres -c "commands, commands, commands" ,
es decir, pasó cualquier comando a su , en lugar de intentar su debajo de su , porque esos comandos (debajo de su ) no están afectados por su . /Editar

Edición 2: vea la respuesta de David Braun para una solución aún mejor: https://stackoverflow.com/a/22947716/694469

¿No puedo cambiar de usuario ( su - postgres ) en un script de aprovisionamiento de shell de arranque Vagrant? (¿Por qué no?)

Estoy escribiendo un guión así. En ese guión, hago:

echo ''===== Creating PostgreSQL databases and users'' su - postgres psql -c " create user SomeUserName password ''...''; alter user ...; "

Aquí, psql debería intentar iniciar sesión como usuario postgres . Sin embargo, lo que sucede es que aparentemente su - postgres falla y el shell intenta iniciar sesión como usuario root . (Al parecer, root es el usuario que ejecuta el script de shell de arranque Vagrant).

Entonces aparece este error y no se invocan los comandos psql:

psql: FATAL: la función "raíz" no existe

Reemplazar su - postgres con sudo su - postgres no tiene ningún efecto (creo que el script ya se ejecuta como root ).

Agregué id (que imprime el ID de usuario actual) antes y después de su - postgres , e id imprime uid=0(root) gid=0(root) groups=0(root) tanto antes como después de llamar a su. Entonces, por lo que puedo decir, su - postgres es algo ignorado? Y una exit determinada, más adelante, cuando intento volver al usuario root , sale por completo del script bootstrap :-(

Sin embargo. Después de hacer vagrant ssh , puedo sudo su - postgres bien, y luego iniciar psql . Pero no desde dentro del script de aprovisionamiento.

(Una solución alternativa es especificar -h 127.0.0.1 --username postgres cuando llamo psql (en lugar de cambiar de usuario a postgres ). Y también habilitar la autenticación basada en la confianza de PostgreSQL para las conexiones locales de VM).


LHP tiene razón: no es realmente un problema vago. Tenía que hacer eso hace algún tiempo y aquí es cómo lo he resuelto:

#!/bin/bash case $(id -u) in 0) echo first: running as root echo doing the root tasks... sudo -u vagrant -i $0 # script calling itself as the vagrant user ;; *) echo then: running as vagrant user echo doing the vagrant user''s tasks ;; esac

Quizás esto pueda ser útil para alguien, pero otra solución obvia será ejecutar un segundo script usando sudo.

CORREGIDO: Gracias Macattack. Escribí directamente en y todavía no se ha probado.

EDITAR: La pregunta se ha editado y ahora su descripción, y la mayoría de las respuestas, se centran en "Cómo crear una base de datos de postgres con el usuario correcto" en lugar de cómo cambiar de usuario en un script vagrant.


No estoy seguro de si puede cambiar de usuario en los scripts de shell Vagrant, ya que puede requerir una entrada del usuario que no puede proporcionar cuando el script se ejecuta en el aprovisionador ... pero ¿por qué no especificar el usuario con el comando psql?

psql --username=postgres -c "..."


echo ''===== Creating PostgreSQL databases and users'' su postgres << EOF psql -c " create user SomeUserName password ''...''; alter user ...; " EOF