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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top