Como posso chamar o psql para que ele não solicite uma senha ?
Isto é o que eu tenho:
psql -Umyuser < myscript.sql
No entanto, não consegui encontrar o argumento que passa a senha e, portanto, o psql sempre solicita isso.
Como posso chamar o psql para que ele não solicite uma senha ?
Isto é o que eu tenho:
psql -Umyuser < myscript.sql
No entanto, não consegui encontrar o argumento que passa a senha e, portanto, o psql sempre solicita isso.
Respostas:
Existem várias maneiras de autenticar no PostgreSQL. Você pode investigar alternativas à autenticação de senha em https://www.postgresql.org/docs/current/static/client-authentication.html .
Para responder à sua pergunta, existem algumas maneiras de fornecer uma senha para autenticação baseada em senha. A maneira óbvia é através do prompt de senha. Em vez disso, você pode fornecer a senha em um arquivo pgpass ou através da PGPASSWORD
variável de ambiente. Veja estes:
Não há opção para fornecer a senha como um argumento de linha de comando, porque essas informações geralmente estão disponíveis para todos os usuários e, portanto, inseguras. No entanto, em ambientes Linux / Unix, você pode fornecer uma variável de ambiente para um único comando como este:
PGPASSWORD=yourpass psql ...
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
Você pode adicionar esta linha de comando no início do seu script:
set PGPASSWORD=[your password]
export PGPASSWORD=[password]
fez trabalho
#!/bin/sh set PGPASSWORD = postgres psql -h 192.168.3.200 -U postgres incx_um << EOF DELETE FROM usrmgt.user_one_time_codes WHERE time < NOW() - INTERVAL '30 minute' EOF
PGPASSWORD=password
.
Se você pretende ter vários hosts / conexões com o banco de dados, o arquivo ~ / .pgpass é o caminho a seguir.
Passos:
vim ~/.pgpass
ou similar. Insira suas informações no seguinte formato:
hostname:port:database:username:password
Não adicione aspas em torno dos valores do seu campo. Você também pode usar * como um curinga para seus campos de porta / banco de dados.chmod 0600 ~/.pgpass
, para que não seja ignorado silenciosamente pelo psql.alias postygresy='psql --host hostname database_name -U username'
Os valores devem corresponder aos que você inseriu no arquivo ~ / .pgpass.. ~/.bashrc
ou similar.Observe que se você tiver um conjunto de variáveis PGPASSWORD = '' de exportação, ele terá precedência sobre o arquivo.
chmod 600
no arquivo, caso contrário psql
o ignorará silenciosamente (de acordo com os documentos).
Essa pode ser uma pergunta antiga, mas há um método alternativo que você pode usar e que ninguém mencionou. É possível especificar a senha diretamente no URI da conexão. A documentação pode ser encontrada aqui , ou aqui .
Você pode fornecer seu nome de usuário e senha diretamente no URI de conexão fornecido para psql
:
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
PGPASSWORD
Se você está tendo problemas no Windows como eu (estou usando o Windows 7 de 64 bits) e set PGPASSWORD=[Password]
não funcionou.
Então, como Kavaklioglu disse em um dos comentários,
export PGPASSWORD=[password]
Você precisará salvá-lo na parte superior do arquivo ou antes de qualquer uso, para que seja definido antes de ser chamado.
Certamente funciona no Windows :)
export PGPASSWORD=[password]
não funciona para mim usando a linha de comando (cmd.exe). Tem certeza de que não estava usando o cygwin ou algo semelhante?
Você precisa criar um arquivo de senha: consulte http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html para obter mais informações.
Dadas as preocupações de segurança sobre o uso da variável de ambiente PGPASSWORD, acho que a melhor solução geral é a seguinte:
Há alguns pontos de nota aqui. A Etapa 1 existe para evitar a sujeira no arquivo ~ / .pgpass do usuário que possa existir. Você também deve garantir que o arquivo tenha permissões 0600 ou menos.
Alguns sugeriram aproveitar o bash para atalho da seguinte maneira:
PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
Isso usa a sintaxe <() para evitar a necessidade de gravar os dados em um arquivo real. Mas não funciona porque o psql verifica qual arquivo está sendo usado e gera um erro como este:
WARNING: password file "/dev/fd/63" is not a plain file
Com base na resposta de mightybyte para aqueles que não se sentem confortáveis com o script * nix shell, aqui está um script de trabalho:
#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
touch $PGPASSFILE
chmod 600 $PGPASSFILE
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE
O cifrão duplo ( $$
) na /tmp/pgpasswd$$
linha 2 anexa o número do ID do processo ao nome do arquivo, para que este script possa ser executado mais de uma vez, mesmo simultaneamente, sem efeitos colaterais.
Observe o uso do chmod
comando na linha 4 - assim como o erro " não é um arquivo simples " descrito por mightybyte , também há um erro " permissões " se isso não for feito.
Na linha 7, você não precisará usar o sinalizador -h
myserver , -p
myport ou -U
jdoe se usar os padrões ( localhost : 5432 ) e tiver apenas um usuário de banco de dados. Para vários usuários, (mas a conexão padrão) altere essa linha para
psql mydb jdoe
Não esqueça de tornar o script executável com
chmod +x runpsql
( ou o que você chamou de arquivo de script )
ATUALIZAR:
Eu segui o conselho de RichVel e tornei o arquivo ilegível antes de colocar a senha nele. Isso fecha um pequeno furo de segurança. Obrigado!
mktemp
para criar um arquivo temporário em vez de criar seu próprio esquema de nomenclatura. Ele cria um novo arquivo temporário (chamado algo como /tmp/tmp.ITXUNYgiNh
no Linux e /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4
no MacOS X) e imprime seu nome em stdout.
chmod 600
depois de criar o arquivo, mas antes de gravar a senha nele. Conforme escrito, um script mal-intencionado no servidor poderia tentar continuamente ler arquivos desse formato e, às vezes, conseguiria obter a senha. Além disso, se esse script for interrompido por algum motivo, o arquivo será deixado no disco - a gravação de um trap
manipulador de shell resolveria isso. Dado que não é trivial escrever um script seguro como esse, recomendo o uso export PGPASSWORD
.
PGPASSWORD
foi descontinuado na 9.3.
Uma alternativa ao uso da PGPASSWORD
variável de ambiente é usar a conninfo
string de acordo com a documentação
Uma maneira alternativa de especificar parâmetros de conexão está em uma string conninfo ou em um URI, que é usado em vez de um nome de banco de dados. Esse mecanismo oferece controle muito amplo sobre a conexão.
$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"
postgres=>
Você pode achar isso útil: Linha de comando do Windows PSQL: existe uma maneira de permitir o login sem senha?
8 anos depois ...
No meu mac, eu tive que colocar uma linha no arquivo
~/.pgpass
como:
<IP>:<PORT>:<dbname>:<user>:<password>
Veja também:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass
Acho que o psql mostra o prompt de senha, mesmo que você defina a variável PGPASSWORD, mas você pode especificar a opção -w para o psql omitir o prompt de senha.