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

7

Eu tenho o seguinte problema: Em todas as máquinas que executam o Postgresql, há um usuário especial do 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 ser executado como usuário postgres , não o script). Até agora, isso não seria um problema: eu poderia simplesmente executar o script como usuário postgres .

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

Como eu posso fazer isso?

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

  1. Não consegui encontrar uma maneira de alterar o EUID em um script Bash
  2. Como posso alterar o EUID ao usar algo parecido
    psql -U postgres -c "<command>" > file?
Christoph Wurm
fonte
como posso mudar o usuário postgres senha no subnível (su -c 'psql -U postgres -c "ALTER forip senha do usuário \ 'senha \';"' postgres)
Fndiaz

Respostas:

5

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

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

Kowh
fonte
5

Você pode querer usar este truque:

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

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


Ou, com sudo:

{ anycommand } | sudo -u user 'tee file'
ulidtko
fonte
Obrigado pela sua ideia. No entanto, estou com dois problemas: su não tem uma opção -u, pelo menos na minha máquina. A execução correta (usuário do comando su -c) leva a outro problema, a saber, que o su deve ser executado a partir de um terminal. Provavelmente não funcionaria de qualquer maneira, pois su abre um novo subshell com esse comando.
@ Legate você sudo no seu sistema?
ulidtko
@ulidtko: Sim, eu faço.
1
então é só usar sudo -u postgres psql -c '...' > filee editar sudoers para solicitações de senha desativar para este comando
gelraen
1

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

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

ajreal
fonte
0

Se você está buscando maneiras complicadas de contornar as restrições de segurança, é melhor se perguntar se seu objetivo é realmente sábio. Não sei nada sobre o postgresql - você realmente precisa estar logado com a conta de administrador para fazer o que está tentando fazer ou há alguma maneira de conceder permissões somente leitura para qualquer conta normal de usuário?

Michael Kopinsky
fonte
Obrigado pela sua resposta. No entanto, não há nenhum problema em executar o script como root, portanto, não há contornar as restrições de segurança.
0

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

alex
fonte
Obrigado pela resposta. No entanto, um teste rápido com sudo su postgres -c "echo test"revela que esse comando não imprime nada. Mudar para root com sudo -se depois executar su postgres -c "echo test"o teste de impressão , parece que é isso sudoque de alguma forma absorve a saída. Não sei por que, no entanto, meu palpite é esse sudoe su -cuse subshells cujo stdout não é arrastado para o meu próprio shell.
Christoph Wurm
Você deve estar faltando alguma coisa. sudo su postgres -c "echo \$USER"imprime postgresna minha caixa.
alex
Bem, ele funciona no meu notebook Ubuntu, mas não no servidor Debian em que o script deve ser executado.
Christoph Wurm