Tengo el siguiente problema: en cada máquina que ejecuta Postgresql hay un usuario especial postgres . Este usuario tiene acceso administrativo al servidor de la base de datos.
Ahora quiero escribir un script Bash que ejecute un comando de base de datos con psql como postgres de usuario (psql se ejecutará como postgres de usuario , no el script). Hasta ahora, eso no sería un problema: podría ejecutar el script como usuario postgres .
Sin embargo, quiero escribir la salida de psql en un archivo en un directorio donde postgres no tiene acceso de escritura.
¿Cómo puedo hacer eso?
Sin embargo, pensé en cambiar los EUID en el script mismo:
- No pude encontrar una manera de cambiar el EUID en un script Bash
- ¿Cómo puedo cambiar el EUID cuando uso algo como
psql -U postgres -c "<command>" > file
?
linux
bash
permissions
shell-script
Christoph Wurm
fuente
fuente
Respuestas:
Use una subshell:
(su -c 'psql -U postgres -c "<command>"' postgres) > file
Dentro de la subshell puede soltar permisos para hacer su trabajo, pero la salida se redirige a su shell original que todavía tiene sus permisos originales.
fuente
Es posible que desee utilizar este truco:
tee(1)
es la utilidad POSIX, por lo que puede confiar en su disponibilidad.O con
sudo
:fuente
sudo -u postgres psql -c '...' > file
y editar sudoers a solicitudes de contraseña de bloqueo para este comandoPuede ejecutar el script de shell con un usuario que tenga un mejor permiso de escritura (como root), y cuando envíe los datos debe escribir en una carpeta en la que el usuario de la base de datos postgres pueda escribir (como / tmp)
una vez finalizada la escritura de datos, muévala al directorio que su script de shell tiene permiso para escribir (como el usuario raíz puede escribir en cualquier lugar)
fuente
Si se le ocurren formas complicadas de eludir las restricciones de seguridad, es mejor que se pregunte si su objetivo es realmente sabio. No sé nada sobre postgresql: ¿realmente necesita iniciar sesión con la cuenta de administrador para hacer lo que está tratando de hacer, o hay alguna forma de otorgar permisos de solo lectura para lo que sea para una cuenta de usuario normal?
fuente
¿Por qué no lo haces así
sudo su postgres -c "psql ..." >/path/to/file
?fuente
sudo su postgres -c "echo test"
revela que dicho comando no imprime nada. Cambiar a root consudo -s
y luego ejecutarsu postgres -c "echo test"
sí prueba de impresión , por lo que parecesudo
que de alguna manera se come la salida. No tengo ni idea de por qué, sin embargo, yo creo quesudo
ysu -c
subniveles de uso cuya salida estándar no es arrastrado a través de mi propia concha.sudo su postgres -c "echo \$USER"
Impresionespostgres
en mi caja.