Como executar parte de um script com privilégios reduzidos?

8

Eu tenho o seguinte problema: Em cada máquina rodando o Postgresql existe um usuário especial postgres . Este usuário tem acesso administrativo ao servidor de banco de dados.

Agora eu quero escrever um script Bash que execute um comando de banco de dados com o psql como usuário postgres (o psql deve executar como usuário postgres , não o script). Até agora, isso não seria um problema: eu poderia apenas executar o script como usuário postgres .

No entanto, eu quero escrever a saída do psql para um arquivo em um diretório onde postgres não tenha acesso de gravação.

Como posso fazer isso?

No entanto, pensei em alterar os EUIDs no próprio script:

  1. Não consegui encontrar uma maneira de alterar o EUID em um script Bash
  2. Como posso alterar o EUID ao usar algo como psql -U postgres -c "<command>" > file ?
por Christoph Wurm 28.01.2011 / 20:54

5 respostas

5

Use um subshell: (su -c 'psql -U postgres -c "<command>"' postgres) > file

Dentro do subshell, você pode soltar permissões para fazer o seu trabalho, mas a saída é redirecionada para o seu shell original, que ainda tem suas permissões originais.

    
por 30.01.2011 / 15:33
5

Você pode usar este truque:

{ anycommand } | su -c 'tee file' user

tee(1) é o utilitário POSIX, então você pode confiar em sua disponibilidade.

Ou com sudo :

{ anycommand } | sudo -u user 'tee file'
    
por 28.01.2011 / 21:03
1

Você pode executar o shell script com o usuário tem melhor permissão de gravação (como root) e, quando você envia os dados, deve gravar em uma pasta na qual o usuário do banco de dados postgres possa gravar (como / tmp)

após a conclusão da gravação de dados, mova-a para o diretório que seu script de shell tem permissão para gravar (como o usuário root pode gravar em qualquer lugar)

    
por 28.01.2011 / 20:58
1

Por que você não faz assim: sudo su postgres -c "psql ..." >/path/to/file ?

    
por 29.01.2011 / 09:45
0

Se você está elaborando maneiras complicadas de burlar as restrições de segurança, é melhor se perguntar se seu objetivo é realmente sensato. Eu não sei nada sobre postgresql - você realmente precisa estar logado com a conta de administrador para fazer o que você está tentando fazer, ou existe alguma maneira você pode conceder permissões somente leitura para o que é para uma conta de usuário normal?

    
por 28.01.2011 / 21:05