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?

Majid Azimi
la source

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
un cheval sans nom
la source
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.

pdm
la source
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  
Moonon
la source
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.

Dhiraj
la source
Ne faites pas ceci: le mot de passe sera visible dans la sortie de ps -ef.
Colin 't Hart