Comment utiliser psql sans invite de mot de passe?


70

J'ai écrit un script pour REINDEXindexer dans une base de données. Voici l'un d'entre eux:

echo -e "\nreindex for unq_vbvdata_vehicle started at: `date "+%F %T"`" >> ${LOG_FILE}
psql -U ${USERNAME} -h ${HOSTNAME} -d ${DBNAME} -c "REINDEX INDEX scm_main.unq_vbvdata_vehicle;"
if [[ ${?} -eq 0 ]]; then
    echo "reindex for unq_vbvdata_vehicle finished at: `date "+%F %T"`" >> ${LOG_FILE}
else
    echo "reindex for unq_vbvdata_vehicle failed" >> ${LOG_FILE}
    exit 1
fi

Le problème est que je ne peux pas exécuter ce script en mode autonome. psqldemande un mot de passe chaque fois qu'il s'exécute. Il y a aussi deux limitations:

  1. Je ne peux pas créer un utilisateur sur la base de données sans mot de passe.

  2. Parce que REINDEXverrouille les tables, je devrais utiliser sleep <num>entre chaque REINDEX.

Y a-t-il une solution automatique?

Réponses:


111

Vous avez quatre choix concernant l’invite de mot de passe:

  1. définissez la variable d'environnement PGPASSWORD. Pour plus de détails, consultez le manuel:
    http://www.postgresql.org/docs/current/static/libpq-envars.html
  2. utilisez un fichier .pgpass pour stocker le mot de passe. Pour plus de détails, consultez le manuel:
    http://www.postgresql.org/docs/current/static/libpq-pgpass.html
  3. utilisez "authentification de confiance" pour cet utilisateur spécifique:
    http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST
  4. utilisez un URI de connexion qui contient tout:
    http://www.postgresql.org/docs/current/static/libpq-connect.html#AEN42532

4
Depuis PostgreSQL 9.1, il existe également peerune méthode d'authentification pour les connexions locales. Actuellement, uniquement pour Linux, BSD, OS X ou Solaris (pas Windows).
— Erwin Brandstetter

1
Une note sur l' .pgpassoption, vous devez toujours spécifier le nom d'utilisateur, la base de données et le nom d'hôte (si vous en avez l'habitude) dans la psqlcommande
— raphael

en ce qui concerne 3, vous devez modifier la méthode. son expliqué ici: gist.github.com/p1nox/4953113
— FuzzyAmi

Facilement utiliser export PGPASSWORD="your_pw"pour aller la version 1
— gies0r

18

Un exemple simple avec PGPASSWORDsera quelque chose comme:

PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME

J'espère que ça aide.


4
Bonjour Ian_H, merci pour vos commentaires et je suis d’accord avec vos arguments. La réponse acceptée est très complète et cela a résolu mon problème. La raison pour laquelle je mets ma réponse à cet ancien message est que ce n'est toujours pas simple, car je pense que d'autres personnes pourraient avoir le même sentiment.
— pdm

C'était certainement un bon ajout à la réponse acceptée - un rappel utile qu'il n'était pas nécessaire de configurer de manière permanente les vars ENV.
— kevlarr

1

Selon les autorisations de votre compte, l'exemple sans spécifier la base de données peut échouer, car les autorisations des utilisateurs sont vérifiées par rapport à la base de données à laquelle vous vous connectez. Il vaut mieux spécifier explicitement la base de données aussi.

# this can fail.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME    

# this is more likely to work, assuming given account has permissions to that database.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME -d YOUR_DATABASE  

0

Des réponses très utiles dans ce fil. J'ajoute simplement ceci pour Ubuntu 18.04:

sudo PGPASSWORD=yourpasswordHere -u postgres psql

Cela vous mènera à postgres sans l'invite du mot de passe, sans avoir à définir de variables d'environnement. Ce n'est pas un paramètre permanent.


Ne faites pas ceci: le mot de passe sera visible dans la sortie de ps -ef.
— Colin 't Hart
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.