Postgresql: script d'exécution psql avec mot de passe
Comment puis-je appeler psql pour que ne demande pas un mot de passe ?
C'est ce que j'ai:
psql -Umyuser < myscript.sql
cependant, je n'ai pas pu trouver l'argument qui passe le mot de passe, et donc psql invite toujours pour lui.
12 réponses
il y a plusieurs façons de s'authentifier à PostgreSQL. Vous pouvez rechercher des alternatives à l'authentification par mot de passe à https://www.postgresql.org/docs/current/static/client-authentication.html .
pour répondre à votre question, il existe plusieurs façons de fournir un mot de passe pour l'authentification par mot de passe. Le moyen évident est l'invite de mot de passe. Au lieu de cela, vous pouvez fournir le mot de passe dans un fichier pgpass PGPASSWORD
variable d'environnement. Voir:
- https://www.postgresql.org/docs/9.0/static/libpq-pgpass.html
- https://www.postgresql.org/docs/9.0/interactive/libpq-envars.html
il n'y a pas d'option pour fournir le mot de passe comme argument de ligne de commande parce que cette information est souvent disponible pour tous les utilisateurs, et donc peu sûre. Cependant, dans les environnements Linux/Unix, vous pouvez fournir une variable d'environnement pour une commande unique comme celle-ci:
PGPASSWORD=yourpass psql ...
, Vous pouvez ajouter cette ligne de commande au début de votre script:
set PGPASSWORD=[your password]
si vous avez l'intention d'avoir plusieurs serveurs/connexions de base de données, le ~/.pgpass fichier est le chemin à parcourir.
Suit:
- créer le ~/.pgpass fichier. Saisissez vos informations dans le format suivant nom d'hôte: port:base de données:nom d'utilisateur: mot de passe
- n'ajoutez pas de guillemets autour de vos valeurs de champ. Vous pouvez également utiliser * comme joker pour vos champs port/base de données.
- Créez un alias dans votre profil bash qui exécute votre commande psql pour vous. Par exemple:
alias postygresy='psql --host hostname database_name -U username'
les valeurs doivent correspondre à celles que vous avez entrées dans le ~/.pgpass fichier. - Source votre profil bash.
- Tapez votre alias depuis la ligne de commande.
notez que si vous avez une exportation PGPASSWORD= " variable set, elle aura priorité sur le fichier. Il est également sage de modifier les permissions de votre fichier afin que le contenu est caché des autres utilisateurs. Cela peut être réalisé avec chmod 600 ~/.pgpass
vous devez créer un fichier de mots de passe: voir http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html pour plus d'information.
si vous avez des problèmes sur windows comme moi (j'utilise Windows 7 64-bit) et set PGPASSWORD=[Password]
n'a pas fonctionné.
puis, comme Kavaklioglu l'a dit dans l'un des commentaires,
export PGPASSWORD=[password]
vous aurez besoin de le sauvegarder en haut du fichier, ou avant tout usage ainsi que son ensemble avant d'être appelé.
fonctionne certainement sur windows :)
étant donné les préoccupations de sécurité liées à L'utilisation de la variable D'environnement PGPASSWORD, je pense que la meilleure solution globale est la suivante:
- écrivez votre propre fichier pgpass temporaire avec le mot de passe que vous voulez utiliser.
- utilisez la variable D'environnement PGPASSFILE pour dire à psql d'utiliser ce fichier.
- supprimer le fichier pgpass temporaire
il y a quelques points à noter ici. L'étape 1 est là pour éviter de coucher avec l'utilisateur ~/.pgpass fichier qui pourrait exister. Vous devez également vous assurer que le fichier dispose des autorisations 0600 ou moins.
certains ont suggéré d'exploiter bash pour raccourcir cela comme suit:
PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
utilise la syntaxe <() pour éviter d'avoir à écrire les données dans un fichier réel. Mais cela ne fonctionne pas parce que psql vérifie quel fichier est utilisé et lancera une erreur comme ceci:
WARNING: password file "/dev/fd/63" is not a plain file
s'appuyant sur mightybyte la réponse de pour ceux qui ne sont pas à l'aise avec *nix shell script, voici un travail de script:
#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
chmod 600 $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE
le signe double dollar ( $$
) dans /tmp/pgpasswd$$
à la ligne 2 ajoute le numéro d'identification du processus au nom du fichier, de sorte que ce script peut être exécuté plus d'une fois, même simultanément, sans effets secondaires.
noter l'utilisation du chmod
commande à la ligne 4-tout comme le" pas un fichier simple " erreur que " mightyoctet décrit, Il ya aussi un " autorisations " erreur si ce n'est pas fait.
à la ligne 6, Vous n'aurez pas à utiliser le -h
myserver , le -p
myport , ou -U
jdoe drapeau si vous utilisez les valeurs par défaut ( localhost : 5432 ) et n'ont qu'un seul utilisateur de base de données. Pour plusieurs utilisateurs (mais la connexion par défaut), changez cette ligne en
psql mydb jdoe
N'oubliez pas de faire le script exécutable avec
chmod +x runpsql
( ou tout ce que vous avez appelé le fichier de script )
il peut être fait simplement en utilisant PGPASSWORD. J'utilise psql 9.5.10. Dans votre cas, la solution serait
PGPASSWORD=password psql -U myuser < myscript.sql
vous pouvez trouver cela utile: Windows PSQL ligne de commande: y a-t-il un moyen de permettre la connexion sans mot de passe?
je trouve, que psql show password prompt même si vous définissez la variable PGPASSWORD, mais vous pouvez spécifier l'option-w pour psql d'omettre la prompt password.
utiliser-w dans la commande: psql-h localhost-p 5432-U user-w