Como posso ter outfiles gravação MySQL como um usuário diferente?
-
04-07-2019 - |
Pergunta
Eu estou trabalhando com uma consulta de MySQL que escreve em um outfile. I executar essa consulta uma vez por dia ou dois e assim que eu quero ser capaz de remover o outfile, sem ter que recorrer a su ou sudo. A única maneira que eu posso pensar em fazer isso acontecer é ter o outfile escrito como pertencente a alguém que não seja o usuário mysql. Isso é possível?
Edit:. Não estou redirecionar a saída para um arquivo, eu estou usando a parte INTO OUTFILE de uma consulta seleção para saída para um arquivo
Se isso ajuda:
mysql --version mysql Ver 14.12 Distrib 5.0.32, for pc-linux-gnu (x86_64) using readline 5.2
Solução
O arquivo de saída é criado pelo processo mysqld, não pelo seu processo de cliente. Portanto, o arquivo de saída deve ser de propriedade da uid e gid do processo mysqld.
Você pode evitar ter de sudo para acessar o arquivo se você acessá-lo a partir de um processo sob um uid ou gid que podem acessar o arquivo. Em outras palavras, se o mysqld cria arquivos de propriedade da "mysql" uid e gid / "mysql", em seguida, adicione a sua própria conta ao grupo "mysql". Então você deve ser capaz de acessar o arquivo, desde o modo de permissão do arquivo inclui acesso do grupo.
Editar:
Está a exclusão de um arquivo em / tmp, com um modo de permissão de diretório de rwxrwxrwt. O sticky bit ( 't') significa que você pode remover arquivos apenas se o uid é o mesmo que o proprietário do arquivo, independentemente das permissões do arquivo ou o diretório.
Se você salvar o arquivo de saída em outro diretório que não tem o conjunto de bits pegajosa, você deve ser capaz de remover o arquivo normalmente.
Leia este trecho da página man para pegajoso (8):
STICKY DIRECTORIES
Um diretório cujo 'bit contrário' é conjunto se torna um diretório somente-anexar, ou, mais precisamente, um diretório em que a exclusão de arquivos é restrito. Um arquivo em um diretório pegajoso só pode ser removido ou renomeado por um usuário se o usuário tem permissão de gravação para o diretório e o usuário é o proprietário do arquivo, o proprietário do diretório ou o super-usuário. Este recurso é útil aplicada aos diretórios como / tmp que deve ser gravável publicamente, mas deve negar aos usuários a licença para arbitrariamente excluir ou renomear arquivos uns dos outros.
Outras dicas
Não usando a sintaxe "SELECT ... INTO OUTFILE", não.
Você precisa executar a consulta (ou seja, o cliente) como outro usuário, e redirecionar a saída. Por exemplo, editar o seu crontab para executar o seguinte comando sempre que quiser:
mysql db_schema -e 'SELECT col,... FROM table' > /tmp/outfile.txt
Isso criará /tmp/outfile.txt como o usuário que é crontab você adicionou o comando.
Se você tiver outro usuário executar a consulta a partir do cron, ele irá criar o arquivo como esse usuário.
Eu só faço
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
e add
/var/www/codeigniter/assets/download/* w,
e
sudo service mysql restart
E é isso, eu posso fazer facilmente SELECT INTO OUTFILE
qualquer nome de arquivo