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:
- Não consegui encontrar uma maneira de alterar o EUID em um script Bash
- Como posso alterar o EUID ao usar algo parecido
psql -U postgres -c "<command>" > file
?
linux
bash
permissions
shell-script
Christoph Wurm
fonte
fonte
Respostas:
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.
fonte
Você pode querer usar este truque:
tee(1)
é o utilitário POSIX, portanto, você pode confiar em sua disponibilidade.Ou, com
sudo
:fonte
sudo -u postgres psql -c '...' > file
e editar sudoers para solicitações de senha desativar para este comandoVocê 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)
fonte
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?
fonte
Por que você simplesmente não faz assim
sudo su postgres -c "psql ..." >/path/to/file
:?fonte
sudo su postgres -c "echo test"
revela que esse comando não imprime nada. Mudar para root comsudo -s
e depois executarsu postgres -c "echo test"
o teste de impressão , parece que é issosudo
que de alguma forma absorve a saída. Não sei por que, no entanto, meu palpite é essesudo
esu -c
use subshells cujo stdout não é arrastado para o meu próprio shell.sudo su postgres -c "echo \$USER"
imprimepostgres
na minha caixa.