não pôde mudar o diretório para “/ home / corey / scripts”: Permissão negada

5

Eu recebo a mensagem de erro ...

could not change directory to "/home/corey/scripts": Permission denied

... quando eu executo o seguinte script ...

#!/bin/bash
sudo -u postgres psql < setup_dev_db.sql
read -rsp $'Press any key to continue...\n' -n 1 key

... o conteúdo de setup_dev_db.sql é executado sem problemas, mas o erro é chato.

Posso me livrar disso?

    
por Corey 11.09.2015 / 16:36

3 respostas

1

Para mudar para um diretório, um usuário deve ter a permissão 'x' para esse diretório.

Suponho que você esteja executando o script em '/ home / corey / scripts'. Quando 'sudo -u postgres' altera o usuário atual para 'postgres', ele tenta definir o diretório de trabalho para 'postgres' para o diretório de trabalho que foi chamado, gerando o erro que você está vendo.

Certifique-se de que o usuário 'postgres' tenha permissão 'x' para '/ home / corey / scripts'.

    
por 11.09.2015 / 17:27
4

O Postgres deseja criar um arquivo $HOME/.psql_history , onde ele armazenará todas as suas consultas e comandos do psql client. Pode muito bem querer fazer outra coisa em $HOME , mas não vejo nenhuma evidência na forma de outros arquivos ocultos. E não criará realmente o arquivo de histórico, a menos que você esteja usando psql interativamente, o que você não é.

Eu tive exatamente este mesmo problema e encontrei esta pergunta, mas a resposta aceita não foi aceitável para mim - eu não deveria ter permissão para postgres deixar um rastro de minhas consultas em qualquer diretório em que eu esteja quando eu executo um script!

@ Corey, a solução que você mencionou no seu comentário ( cd /tmp antes de chamar sudo... ) é provavelmente a melhor. psql não criará este arquivo em /tmp (tenho certeza de que isso é deliberado, pois pode permitir que usuários sem privilégios leiam o arquivo).

Existem outras duas soluções em que posso pensar:

  1. Execute psql em um shell de login adicionando -i ao seu comando

    sudo -i -u postgres psql < setup_dev_db.sql
    

    Isso definirá o diretório $HOME to postgres HOME , listado em /etc/passwd . Para o Ubuntu, isso é /var/lib/postgres . Mas como você está enviando comandos, não criará um arquivo .psql_history . No entanto, se você usar o psql interativo, qualquer outra pessoa com privilégios sudo na máquina terá acesso ao seu histórico de comandos.

    Não tenho certeza se há outras consequências negativas para a execução de um shell de login nessa situação.

  2. Execute psql como um usuário com menos privilégios, por exemplo,

    $ psql dev_db -hlocalhost corey_dev -W < setup_dev_db.sql
    

    Se isso for um problema porque você deixa a criação do usuário postgres no seu script setup_dev_db.sql , e você ainda não tem nenhum usuário, apenas adicione um comando createuser no seu script primeiro, algo assim:

    $ sudo -u postgres createuser corey_dev -P
    

    e talvez ...

    $ sudo -u postgres createdb dev_db "Dev database"
    

NOTA: Ao usar o psql cliente interativamente (que você não está aqui), se vir uma mensagem como could not change directory to "/home/corey/scripts": Permission denied message ****, psql vai escrever em /var/lib/postgres/.psql_history (ou onde quer que seja $HOME )! Se você já viu esse aviso ao usar o psql interativo, vá em frente - você provavelmente encontrará um arquivo de histórico oculto.

    
por 06.10.2017 / 10:02
0

Você pode usar sudo -u postgres -c your_command.bash ou su postgres -c your_command.bash . Você também pode usar,

su - postgres your_command.bash

Isso garantirá que você adquiriu todo o ambiente de conta do postgres.

    
por 05.10.2017 / 13:38