Comment exécuter une partie d'un script avec des privilèges réduits?

7

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:

  1. Je n'ai pas trouvé de moyen de changer l'EUID dans un script Bash
  2. Comment puis-je changer l'EUID lorsque j'utilise quelque chose comme
    psql -U postgres -c "<command>" > file?
Christoph Wurm
la source
comment puis-je changer le mot de passe utilisateur postgres en sous-shell (su -c 'psql -U postgres -c "ALTER USER forip PASSWORD \' password \ ';"' postgres)
Fndiaz

Réponses:

5

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.

Kowh
la source
5

Vous voudrez peut-être utiliser cette astuce:

{ anycommand } | su -c 'tee file' user

tee(1) est l'utilitaire POSIX, vous pouvez donc vous fier à sa disponibilité.


Ou, avec sudo:

{ anycommand } | sudo -u user 'tee file'
ulidtko
la source
Merci pour ton idée. Cependant, je rencontre deux problèmes: su n'a pas d'option -u, au moins sur ma machine. Le faire fonctionner correctement (utilisateur de la commande su -c) entraîne un autre problème, à savoir que su doit être exécuté à partir d'un terminal. Cela ne fonctionnerait probablement pas de toute façon car su ouvre un nouveau sous-shell avec cette commande.
@Legate avez-vous sudo sur votre système?
ulidtko
@ulidtko: Oui, je le sais.
1
puis utilisez sudo -u postgres psql -c '...' > fileet modifiez sudoers pour désactiver les invites de mot de passe pour cette commande
gelraen
1

Vous 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ù)

ajreal
la source
0

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?

Michael Kopinsky
la source
Merci pour votre réponse. Cependant, il n'y a aucun problème lors de l'exécution du script en tant que root, donc aucun contournement des restrictions de sécurité ne se produit.
0

Pourquoi ne faites-vous pas comme ça sudo su postgres -c "psql ..." >/path/to/file:?

alex
la source
Merci pour votre réponse. Cependant, un test rapide avec sudo su postgres -c "echo test"révèle qu'une telle commande n'imprime rien. Passer à root avec sudo -spuis exécuter su postgres -c "echo test"fait un test d' impression , il semble donc que ce soit en sudoquelque sorte qui mange la sortie. Je n'ai aucune idée pourquoi cependant, je suppose que cela sudoet su -cutiliser des sous-coquilles dont la sortie standard n'est pas glissée dans mon propre shell.
Christoph Wurm
Vous devez manquer quelque chose. sudo su postgres -c "echo \$USER"imprime postgressur ma boîte.
alex
Eh bien, cela fonctionne sur mon bloc-notes Ubuntu, mais pas sur le serveur Debian où le script doit s'exécuter.
Christoph Wurm