2011-06-29 26 views
174

¿Cómo puedo llamar a psql para que no solicite una contraseña?Postgresql: Scripting ejecución de psql con contraseña

Esto es lo que tengo:

psql -Umyuser < myscript.sql 

Sin embargo, no pude encontrar el argumento de que pasa la contraseña, y así psql siempre solicita.

+3

Terminé yendo a la variable de entorno PGPASSWORD. Esto encajó perfectamente mi uso. Simple y autónomo en el guión. –

Respuesta

199

Hay varias maneras de autenticar a PostgreSQL. Es posible que desee investigar alternativas a la autenticación con contraseña al http://www.postgresql.org/docs/current/static/client-authentication.html.

Para responder a su pregunta, hay algunas formas 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 mediante la variable de entorno PGPASSWORD. Vea éstas:

http://www.postgresql.org/docs/9.0/static/libpq-pgpass.html http://www.postgresql.org/docs/9.0/interactive/libpq-envars.html

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

PGPASSWORD = psql yourpass ...

+9

Creo que PGPASSWORD está en desuso, pero aún funciona, por cierto. Solo FYI –

+19

Sí, está en desuso (y lo anotamos en uno de los enlaces). Desde que surgió, es probable que también valga la pena señalar que la obsolescencia es muy controvertida porque es extremadamente útil para muchas personas y, sin embargo, puede utilizarse en algunas circunstancias sin graves problemas de seguridad. Me parece que no es peor que almacenar .pgpass en un sistema de archivos NFS, por ejemplo. Yo uso PGPASSWORD rutinariamente. – Reece

54

puede agregar esta línea de comandos en el comienzo de la secuencia de comandos:

set PGPASSWORD=[your password] 
+18

en mi caso el comando set no funcionaba, pero 'export PGPASSWORD = [contraseña]' funcionaba –

+7

'SET 'debería funcionar en Windows. –

109
PGPASSWORD=[your password] psql -Umyuser < myscript.sql 
+3

Quería este tipo de instrucción de comando simple – pmverma

10

Si usted está teniendo problemas en las ventanas 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 este en la parte superior del archivo, o antes de cualquier uso por lo que su conjunto antes de ser llamado.

hace Ciertamente, el trabajo en las ventanas :)

+1

'export PGPASSWORD = [contraseña]' no funciona para mí usando la línea de comando (cmd.exe) en absoluto. ¿Estás seguro de que no estabas usando cygwin o algo similar? –

+0

Solo funciona con cl, lo agregaste al archivo ¿no? ¿Ahora solo lo tipeó en comando? –

+0

está bien usarlo en el entorno Linux/Mac, para Windows, creo que debería encontrar una forma de exportar esta variable de entorno. –

5

Teniendo en cuenta 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 temporal con el pgpass contraseña que quiere usar
  2. Utilice la variable de entorno PGPASSFILE para indicarle a psql que use ese archivo.
  3. Retire el archivo temporal pgpass

Hay un par de puntos de la nota aquí. El paso 1 está allí para evitar el borrado con el archivo ~/.pgpass del usuario que pueda existir. También debe asegurarse de que el archivo tenga permisos de 0600 o menos.

Algunos han sugerido el aprovechamiento de bash para el acceso directo de la siguiente manera:

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

Este utiliza la sintaxis <() para evitar tener que escribir los datos en un archivo real. Pero no funciona porque los cheques psql qué archivo se está utilizando y lanzarán un error como este:

WARNING: password file "/dev/fd/63" is not a plain file 
+0

Un ejemplo de trabajo de este enfoque aparece en https://stackoverflow.com/a/40614592/3696363, otra respuesta a esta pregunta. –

+0

Aunque este usuario realmente no pidió lo mismo que estoy buscando, diría que el enfoque no coincide. Al usar la sintaxis PGPASSFILE = <(whatever), puede hacer cosas como descifrar un archivo y solo tenerlo presente en el descriptor de archivo que se crea. Al escribir un archivo temporal, no está resolviendo fundamentalmente el problema de tener un archivo en el disco con credenciales. No es divertido lidiar con reglas industriales arbitrarias como esa, pero es algo con lo que muchas personas se enfrentan. – Desidero

29

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

Pasos:

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

Tenga en cuenta que si tiene una exportación de PGPASSWORD = '' establecida, tendrá prioridad sobre el archivo. También es aconsejable cambiar los permisos de su archivo para que los contenidos sean ocultados por otros usuarios. Esto se puede lograr con chmod 600 ~/.pgpass

2

Basándose en mightybyte's answer para aquellos que no se sienten cómodos con * nix scripting cáscara, aquí está un guión 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 agrega el número de ID del proceso al nombre del archivo, de modo que este script se puede ejecutar más de una vez, incluso de forma simultánea, sin efectos secundarios.

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

En la línea 6, no tendrá que utilizar el -hmiservidor, la -pmyport, o -Ujperez bandera de si utilizar los valores por defecto (localhost : 5432) y sólo tienen un usuario de base de datos.Para varios usuarios, pero la conexión (por defecto) cambiar esa línea para

psql mydb jdoe 

No se olvide de hacer que el script ejecutable con

chmod +x runpsql (o lo que llamó el archivo de script)

+1

Puede usar ['mktemp'] (https://en.wikipedia.org/wiki/Mktemp) para crear un archivo temporal en lugar de crear su propio esquema de nombres. Crea un nuevo archivo temporal (denominado algo como '/ tmp/tmp.ITXUNYgiNh' en Linux y'/var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4' en MacOS X) e imprime su nombre a stdout. –

-4

uso -w en el comando: psql -h localhost -p 5432 -U usuario -w

-1

Encuentro que el indicador psql show password incluso usted define la variable PGPASSWORD, pero puede especificar la opción -w para que psql omita la solicitud de contraseña.

1

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

Cuestiones relacionadas