J'ai le problème suivant: Sur chaque machine exécutant Postgresql, il existe un postgres utilisateur spécial . Cet utilisateur dispose d'un accès administratif au serveur de base de données.
Maintenant, je veux écrire un script Bash qui exécute une commande de base de données avec psql en tant que postgres utilisateur (psql doit s'exécuter en tant que postgres utilisateur , pas le script). Jusqu'à présent, ce ne serait pas un problème: je pourrais simplement exécuter le script en tant que postgres utilisateur .
Cependant, je veux écrire la sortie de psql dans un fichier dans un répertoire où postgres n'a pas d'accès en écriture.
Comment puis je faire ça?
J'ai cependant pensé à changer les EUID dans le script lui-même:
- Je n'ai pas trouvé de moyen de changer l'EUID dans un script Bash
- Comment puis-je changer l'EUID lorsque j'utilise quelque chose comme
psql -U postgres -c "<command>" > file
?
linux
bash
permissions
shell-script
Christoph Wurm
la source
la source
Réponses:
Utilisez un sous-shell:
(su -c 'psql -U postgres -c "<command>"' postgres) > file
À l'intérieur du sous-shell, vous pouvez supprimer les autorisations pour faire votre travail, mais la sortie est redirigée vers votre shell d'origine qui a toujours vos autorisations d'origine.
la source
Vous voudrez peut-être utiliser cette astuce:
tee(1)
est l'utilitaire POSIX, vous pouvez donc vous fier à sa disponibilité.Ou, avec
sudo
:la source
sudo -u postgres psql -c '...' > file
et modifiez sudoers pour désactiver les invites de mot de passe pour cette commandeVous pouvez exécuter le script shell avec l'utilisateur disposant d'une meilleure autorisation d'écriture (comme root), et lorsque vous sortez les données doivent écrire dans un dossier dans lequel les utilisateurs de base de données peuvent écrire (comme / tmp)
une fois l'écriture des données terminée, déplacez-la dans le répertoire que votre script shell est autorisé à écrire (comme l'utilisateur root peut écrire n'importe où)
la source
Si vous trouvez des moyens délicats de contourner les restrictions de sécurité, vous feriez mieux de vous demander si votre objectif est vraiment sage. Je ne sais rien de postgresql - avez-vous vraiment besoin d'être connecté avec le compte administrateur pour faire ce que vous essayez de faire, ou existe-t-il un moyen d'accorder des autorisations en lecture seule pour un compte d'utilisateur normal?
la source
Pourquoi ne faites-vous pas comme ça
sudo su postgres -c "psql ..." >/path/to/file
:?la source
sudo su postgres -c "echo test"
révèle qu'une telle commande n'imprime rien. Passer à root avecsudo -s
puis exécutersu postgres -c "echo test"
fait un test d' impression , il semble donc que ce soit ensudo
quelque sorte qui mange la sortie. Je n'ai aucune idée pourquoi cependant, je suppose que celasudo
etsu -c
utiliser des sous-coquilles dont la sortie standard n'est pas glissée dans mon propre shell.sudo su postgres -c "echo \$USER"
imprimepostgres
sur ma boîte.