2008-10-23 17 views
11

Pracuję z kwerendy MySQL, które zapisuje do outfile. Uruchamiam to zapytanie raz dziennie lub dwa, więc chcę móc usunąć plik wyjściowy bez konieczności uciekania się do su lub sudo. Jedynym sposobem, w jaki mogę to zrobić, jest posiadanie pliku wyjściowego napisanego w posiadaniu kogoś innego niż użytkownik mysql. czy to możliwe?Jak mogę wypisać pliki wyjściowe MySQL jako inny użytkownik?

Edytuj: Nie przekierowuję danych wyjściowych do pliku, używam części INTO OUTFILE z kwerendy wyboru do wyprowadzenia do pliku.

Jeśli to pomoże:

 
mysql --version 
mysql Ver 14.12 Distrib 5.0.32, for pc-linux-gnu (x86_64) using readline 5.2 

Odpowiedz

10

Plik wyjściowy jest tworzony przez proces mysqld, a nie przez proces klienta. Dlatego plik wyjściowy musi należeć do identyfikatora UID i gid procesu mysqld.

Możesz uniknąć konieczności sudo, aby uzyskać dostęp do pliku, jeśli uzyskasz do niego dostęp z procesu pod nazwą UID lub GID, które mogą uzyskać dostęp do pliku. Innymi słowy, jeśli mysqld tworzy pliki należące do uid i gid "mysql"/"mysql", dodaj własne konto do grupy "mysql". Następnie powinieneś mieć dostęp do pliku, o ile tryb uprawnień do pliku obejmuje dostęp do grupy.

Edit:

Usuwasz plik w/tmp, w trybie uprawnień katalogu rwxrwxrwt. Lepki bit ("t") oznacza, że ​​możesz usuwać pliki tylko wtedy, gdy twój identyfikator użytkownika jest taki sam jak właściciela pliku, niezależnie od uprawnień do pliku lub katalogu.

Jeśli zapiszesz plik wyjściowy w innym katalogu, który nie ma ustawionego bitu, powinieneś być w stanie usunąć plik normalnie.

Przeczytaj ten fragment strony man dla lepkich (8):

lepki katalogach

katalogu, którego `sticky bit” jest ustawiony staje się katalog append-only, lub, bardziej precyzyjnie, katalog, w którym usuwanie plików jest ograniczone. Plik w przyklejonym katalogu może być usunięty lub zmieniony przez użytkownika tylko wtedy, gdy użytkownik ma uprawnienia do zapisu dla katalogu, a użytkownik jest właścicielem pliku, właścicielem katalogu lub superużytkownikiem. Ta funkcja jest użytecznie stosowana do katalogów takich jak/tmp, które muszą być publicznie zapisywalne, ale powinny odmawiać użytkownikom licencji do arbitralnego usuwania lub zmieniania nazw plików innych użytkowników.

+1

Plik jest własnością w "mysql"/"mysql" i modded 666. Dodałem ed się do grupy mysql i nadal nie mogę go usunąć. –

+0

Jakie są prawa własności i uprawnienia do katalogu, w którym plik się znajduje? –

+0

Ja * myślę, że Bill rozumie, że musisz mieć uprawnienia do zapisu do katalogu zawierającego, aby móc usunąć plik w systemie UNIX (b/c aktualizuje katalog). Tak więc "chgrp mysql", katalog i "chmod ug + rwX", aby dać użytkownikowi mysql-user napisać perms w reż. – joelhardi

1

Jeśli masz inny użytkownik uruchomić zapytanie z crona, to stworzy plik jako tego użytkownika.

5

Nie używając składni "SELECT ... INTO OUTFILE", nie.

Należy uruchomić zapytanie (np. Klienta) jako inny użytkownik i przekierować dane wyjściowe. Na przykład edytować crontab uruchomić następującą komendę, kiedy tylko chcesz:

mysql db_schema -e 'SELECT col,... FROM table' > /tmp/outfile.txt 

To stworzy /tmp/outfile.txt jako użytkownik, który znajduje crontab dodasz polecenie.

+0

Należy zauważyć, że rurociągi przyniosą różne wyniki w porównaniu do 'do pliku wyjściowego'. Na przykład piping zawiera nazwy kolumn jako pierwszy wiersz, NULL zamiast \ N itd. (W systemie Ubuntu. Szczegóły mogą się różnić w innych systemach operacyjnych) –

1

prostu robię

sudo gedit /etc/apparmor.d/usr.sbin.mysqld 

i dodać

/var/www/codeigniter/assets/download/* w, 

i

sudo service mysql restart 

I to wszystko, co mogę zrobić łatwo SELECT INTO OUTFILE dowolną nazwę pliku

Powiązane problemy