Postgresql: Scripting ejecución psql con contraseña


¿Cómo puedo llamar a psql para que no solicite una contraseña?

Esto es lo que tengo:

psql -Umyuser < myscript.sql

Sin embargo, no pude encontrar el argumento que pasa la contraseña, por lo que psql siempre lo solicita.

Author: steakunderscore, 2011-06-29

12 answers

Hay varias formas de autenticarse en PostgreSQL. Es posible que desee investigar alternativas a la autenticación con contraseña en https://www.postgresql.org/docs/current/static/client-authentication.html .

Para responder a su pregunta, hay algunas maneras de proporcionar una contraseña para la autenticación basada en contraseña. La forma obvia es a través de la solicitud de contraseña. En lugar de eso, puede proporcionar la contraseña en un archivo pgpass o a través de la variable de entorno PGPASSWORD. Ver estos:

No hay ninguna opción para proporcionar la contraseña como argumento de la línea de comandos porque esa información está a menudo disponible para todos los usuarios, y por lo tanto es insegura. Sin embargo, en entornos Linux/Unix puede proporcionar una variable de entorno para un solo comando como este:

PGPASSWORD=yourpass psql ...
 231
Author: Reece,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-01 09:56:08
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
 124
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-04 07:48:24

Puede agregar esta línea de comandos al principio de su script:

set PGPASSWORD=[your password]
 57
Author: jbaylina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-19 19:49:07

Si tiene la intención de tener múltiples hosts/conexiones de base de datos, el ~/.pgpass file es el camino a seguir.

Pasos:

  1. Crea el~/.archivo pgpass. Ingrese su información en el siguiente formato hostname:port:database:username:password
  2. No agregue comillas de cadena alrededor de sus valores de campo. También puede usar * como comodín para sus campos de puerto/base de datos.
  3. Cree un alias en su perfil de bash que ejecute el comando psql por usted. Por ejemplo: alias postygresy='psql --host hostname database_name -U username' El los valores deben coincidir con los que ingresaste a~/.archivo pgpass.
  4. Fuente de su perfil de bash.
  5. Escriba su alias desde la línea de comandos.

Tenga en cuenta que si tiene una variable export PGPASSWORD=" establecida, tendrá prioridad sobre el archivo. También es aconsejable cambiar los permisos de su archivo para que el contenido se oscurezca de otros usuarios. Esto se puede lograr con chmod 600 ~/.pgpass

 38
Author: tandy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-13 17:38:35

Tienes que crear un archivo de contraseña: ver http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html para más información.

 12
Author: Femi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-29 15:24:55

Si tienes problemas en Windows como yo (estoy usando Windows 7 de 64 bits) y set PGPASSWORD=[Password] no funcionó.

Entonces, como dijo Kavaklioglu en uno de los comentarios,

export PGPASSWORD=[password]

Tendrá que guardar esto en la parte superior del archivo, o antes de cualquier uso para que se establezca antes de ser llamado.

Ciertamente funciona en Windows :)

 11
Author: Jamie Hutber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-05 10:12:31

Dadas las preocupaciones de seguridad sobre el uso de la variable de entorno PGPASSWORD, creo que la mejor solución general es la siguiente:

  1. Escriba su propio archivo pgpass temporal con la contraseña que desea utilizar.
  2. Use la variable de entorno PGPASSFILE para indicar a psql que use ese archivo.
  3. Eliminar el archivo temporal pgpass

Hay un par de puntos de nota aquí. El paso 1 está ahí para evitar meterse con el ~ / del usuario.archivo pgpass que pueda existir. Tú también debe asegurarse de que el archivo tiene permisos 0600 o menos.

Algunos han sugerido aprovechar bash para acortar esto de la siguiente manera:

PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb

Esto usa la sintaxis

WARNING: password file "/dev/fd/63" is not a plain file
 6
Author: mightybyte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-05 20:17:00

Basándose en la respuesta de mightybyte para aquellos que no se sienten cómodos con * nix shell scripting, aquí hay un script de trabajo:

#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
chmod 600 $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE

El doble signo de dólar ($$) en /tmp/pgpasswd$$ en la línea 2 añade el número de identificación del proceso al nombre del archivo, de modo que este script se puede ejecutar más de una vez, incluso simultáneamente, sin efectos secundarios.

Tenga en cuenta el uso del comando chmod en la línea 4-al igual que el error "no es un archivo simple " que mightybyte descrito, también hay un error" permissions " si esto no se hace.

En la línea 6, no tendrá que usar el -hmyserver , el -pmyport, o -Ujdoe marca si usas los valores predeterminados (localhost : 5432) y solo tiene un usuario de base de datos. Para varios usuarios, (pero la conexión predeterminada) cambie esa línea a

psql mydb jdoe

No olvides hacer el script ejecutable con

chmod +x runpsql (o como se llame el archivo de script)

 5
Author: Eliyahu Skoczylas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-20 04:42:09

Se puede hacer simplemente usando PGPASSWORD. Estoy usando psql 9.5.10. En su caso, la solución sería

PGPASSWORD=password psql -U myuser < myscript.sql

 4
Author: pyAddict,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-23 06:09:14
 3
Author: A Question Asker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:42

Me parece, que psql mostrar contraseña prompt incluso se define PGPASSWORD variable, pero se puede especificar-w opción para psql omitir contraseña prompt.

 -1
Author: Mark Lokshin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-20 09:12:14

Use-w en el comando: psql-h localhost-p 5432-U user-w

 -5
Author: vjOnstack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-22 17:43:02