Como usar o psql sem solicitação de senha?


70

Eu escrevi um script para REINDEXíndices em um banco de dados. Aqui está um deles:

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

O problema é que não consigo executar este script no modo autônomo. psqlestá solicitando a senha toda vez que é executado. Há também duas limitações:

  1. Não consigo criar um usuário no banco de dados sem senha.

  2. Porque REINDEXbloqueia tabelas, devo usar sleep <num>entre cada uma REINDEX.

Existe alguma solução automática?

Respostas:


111

Você tem quatro opções em relação ao prompt de senha:

  1. defina a variável de ambiente PGPASSWORD. Para detalhes, consulte o manual:
    http://www.postgresql.org/docs/current/static/libpq-envars.html
  2. use um arquivo .pgpass para armazenar a senha. Para detalhes, consulte o manual:
    http://www.postgresql.org/docs/current/static/libpq-pgpass.html
  3. use "autenticação de confiança" para esse usuário específico:
    http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST
  4. use um URI de conexão que contenha tudo:
    http://www.postgresql.org/docs/current/static/libpq-connect.html#AEN42532

4
Desde o PostgreSQL 9.1, também existe o peermétodo de autenticação para conexões locais. Atualmente, apenas para Linux, BSD, OS X ou Solaris (não Windows).
Erwin Brandstetter

11
Uma nota sobre a .pgpassopção, você ainda tem que especificar nome de usuário, banco de dados e o nome do host (se você teria normalmente) no psqlcomando
raphael

em relação a 3, você precisa editar o método. É explicado aqui: gist.github.com/p1nox/4953113
FuzzyAmi

Use facilmente export PGPASSWORD="your_pw"para ir versão 1
gies0r

18

Um exemplo simples com PGPASSWORDserá algo como:

PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME

Espero que ajude.


4
Oi Ian_H, obrigado por seus comentários e eu concordo com seus pontos. A resposta aceita é muito abrangente e isso resolveu meu problema. A razão pela qual respondi a esse post antigo é porque ainda não é direto para mim, pois acredito que outros possam ter o mesmo sentimento.
Pdm

Definitivamente, foi uma boa adição à resposta aceita - lembrete útil de que não precisamos definir permanentemente os vars ENV.
kevlarr

1

Dependendo das permissões da sua conta, o exemplo sem especificar o banco de dados pode falhar, porque as permissões do usuário são verificadas no banco de dados ao qual você se conecta. É melhor especificar explicitamente o banco de dados também.

# 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  

0

Respostas muito úteis neste tópico. Estou apenas adicionando isso para o ubuntu 18.04:

sudo PGPASSWORD=yourpasswordHere -u postgres psql

Isso o levará ao postgres sem o prompt de senha, sem precisar definir nenhuma variável de ambiente. Esta não é uma configuração permanente.


Não faça isso: a senha será visível na saída do ps -ef.
Colin 'Hart
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.