Discussion:
select ... into outfile: Berechtigung?!
(zu alt für eine Antwort)
Hannes Birnbacher
2005-07-22 06:49:23 UTC
Permalink
Mit Eurer Hilfe (Danke!) hat nach nur einer Woche Arbeit der
Aufbau einer Datenbank für meine Zwecke geklappt, nur einen Tag
nach dem eigentlichen Abgabetermin für die Arbeit, die ich damit
erledigen wollte.

Jetzt würde ich natürlich gerne Abfragen irgendwie ausdrucken.
Gibt es da einen besseren Weg als einen Screenshot?! Ich habe auf
meiner Linux-Maschine einen Benutzer "web", unter dem ich
Mysql aufrufe und auch die MySql-Datenbanken und
Tabellen lesen kann, bloß der Ausgabebefehl mißlingt:

mysql> select * from teilgebiet into outfile
'/home/web/mysql/teilgebiet.txt';

ERROR 1045: Access denied for
user: '***@localhost' (Using password: YES)

Das Mysql-Handbuch sagt dazu:
"Die SELECT ... INTO OUTFILE 'datei'-Form von SELECT schreibt die
ausgewählten Zeilen in eine Datei. Die Datei wird auf dem
Server-Host erzeugt und darf nicht bereits bestehen (das
verhindert unter anderem, dass Datenbanktabellen und Dateien wie
/etc/passwd zerstört werden). Sie benötigen die file-Berechtigung
auf dem Server-Host, um diese Form von SELECT auszuführen."

Was wollen die mit letzterem Satz sagen?! Das Ziel-Directory
/home/web/mysql ist für "others" beschreibbar.

TIA
Wolfram Kraus
2005-07-22 07:01:39 UTC
Permalink
Post by Hannes Birnbacher
Mit Eurer Hilfe (Danke!) hat nach nur einer Woche Arbeit der
Aufbau einer Datenbank für meine Zwecke geklappt, nur einen Tag
nach dem eigentlichen Abgabetermin für die Arbeit, die ich damit
erledigen wollte.
Jetzt würde ich natürlich gerne Abfragen irgendwie ausdrucken.
Gibt es da einen besseren Weg als einen Screenshot?! Ich habe auf
meiner Linux-Maschine einen Benutzer "web", unter dem ich
Mysql aufrufe und auch die MySql-Datenbanken und
mysql> select * from teilgebiet into outfile
'/home/web/mysql/teilgebiet.txt';
ERROR 1045: Access denied for
"Die SELECT ... INTO OUTFILE 'datei'-Form von SELECT schreibt die
ausgewählten Zeilen in eine Datei. Die Datei wird auf dem
Server-Host erzeugt und darf nicht bereits bestehen (das
verhindert unter anderem, dass Datenbanktabellen und Dateien wie
/etc/passwd zerstört werden). Sie benötigen die file-Berechtigung
auf dem Server-Host, um diese Form von SELECT auszuführen."
Was wollen die mit letzterem Satz sagen?! Das Ziel-Directory
/home/web/mysql ist für "others" beschreibbar.
TIA
Der letzte Satz sagt, dass deinem Benutzer "web" von MySQL nicht erlaubt
wird, den Befehl auszuführen, da er das Privileg "FILE" nicht besitzt.
Sonst könnte ja jeder DB-Nutzer herkommen, und dir deine Server-Platte
vollmüllen ;-)
Wie du es ihm erlauben kannst (und was es sonst noch für Rechte gibt),
liest du hier:

http://dev.mysql.com/doc/mysql/en/grant.html

HTH,
Wolfram
Hannes Birnbacher
2005-07-22 08:20:41 UTC
Permalink
Antwort an Wolfram Kraus auf die Nachricht von Fri, 22 Jul 2005
09:01:39 +0200
Post by Wolfram Kraus
Post by Hannes Birnbacher
ERROR 1045: Access denied for
(...) Sie benötigen die
file-Berechtigung auf dem Server-Host, um diese Form von
SELECT auszuführen."
Der letzte Satz sagt, dass deinem Benutzer "web" von MySQL nicht
erlaubt wird, den Befehl auszuführen, da er das Privileg "FILE"
nicht besitzt.
Danke, hab' grad' auf die harte Tour rausgefunden, dass in MySql
User diverse Privilegien haben bzw. brauchen (und ehrlich gesagt,
das MySql-Buch von Kofler ist Scheisse, die Beispiele und das
Tutorial unvollständig und dann hab' ich als sparsamer Mensch auch
noch die in reines Pidgin-Englisch übersetzte Version
erstanden;-).


Für's Archiv, mit

GRANT file ON *.* TO ***@localhost;

hab' ich das Problem gelöst, rausgelesen aus:

http://www.scriptindex.de/manuals/mysql/manual.de_MySQL_Database_Administration.html#Adding_users

Alle anderen Quellen haben den Befehl und seine Anwendung gar
nicht oder nur ungenau beschrieben und offensichtlich hat jeder
vom anderen abgeschrieben - ich hab's stundenlang mit grant
privileges file, grant privileges(file) usw. usf. probiert.

@Christian: ja, danke, ein Pipe-Befehl wie der von Dir
dankenswerterweise vorgegebene ist das nächste, was ich probieren
wollte. Und nein, die vorhandenen Handbücher durchzulesen bzw.
nach dem Stichwort zu suchen, hat nichts gebracht (ausser
übrigens einem Angebot, wie man seinem Einkommen 'ne halbe Mio
Dollar hinzufügen kann, und wir lieben ja unsere amerikanischen
Spammer, die sich in allen möglichen Foren verewigen;-). Ein paar
Eindrücke über die praktische Nutzbarkeit diversester Manuals hab'
ich ja oben erbost wiedergegeben.

@Axel: danke für die detaillierten Tipps. Mir schwante schon vor
ein paar Tagen, als ich über "tee" nachlas, dass ich das brauchen
könnte. Wollte evtl. wie in alter Zeit (da kamen die Textfiles aus
einer MDT-Anlage von Kienzle) aus dem drögen Text-Output mit AWK
hübsch formatierte Listen bzw. Karteiblätter machen (von perl
versteh' ich nix).

Allerdings scheint mir PHP die Datenbanksprache für
weitergehende Auswertungen zu sein, die ich aus
Clipper/dBase/Crystal kenne und bisher beim
mysql-Interface vermisse? Muss mich mal damit befassen.
Installiert ist PHP4 bei mir, aber auch wenn ich apache starte,
ohne weitere Konfiguration werden bei mir lokal keine .php Files
interpretiert <seufz>.
--
Fossilienausstellung und mehr
im Brueckenhofmuseum Koenigswinter-Oberdollendorf
(Siebengebirge):
http://www.brueckenhof.de
Christian Kirsch
2005-07-22 08:41:20 UTC
Permalink
Post by Hannes Birnbacher
Antwort an Wolfram Kraus auf die Nachricht von Fri, 22 Jul 2005
09:01:39 +0200
Post by Wolfram Kraus
Post by Hannes Birnbacher
ERROR 1045: Access denied for
(...) Sie benötigen die
file-Berechtigung auf dem Server-Host, um diese Form von
SELECT auszuführen."
Der letzte Satz sagt, dass deinem Benutzer "web" von MySQL nicht
erlaubt wird, den Befehl auszuführen, da er das Privileg "FILE"
nicht besitzt.
Danke, hab' grad' auf die harte Tour rausgefunden, dass in MySql
User diverse Privilegien haben bzw. brauchen (und ehrlich gesagt,
das MySql-Buch von Kofler ist Scheisse, die Beispiele und das
Tutorial unvollständig und dann hab' ich als sparsamer Mensch auch
noch die in reines Pidgin-Englisch übersetzte Version
erstanden;-).
Und warum liest Du nicht einfach die MySQL-Dokumentation? Die kostet
überhaupt nix und das Englisch ist ok.

Abgesehen davon enthält der Kofler zu MySQL 5 schlappe 40 Seiten zum
Thema Zugriffsverwaltung und Sicherheit. LESEN muss man allerdings schon
wollen.
Post by Hannes Birnbacher
Für's Archiv, mit
Super. Jetzt hast Du einen Benutzer ohne Passwort, der (fast) alles auf
Deiner Datenbank anrichten darf. Das hättest Du auch mit der DB "test"
und dem gleichamigen Benutzer erreichen können, ganz ohne das schwierige
Handbuchstudium.
Post by Hannes Birnbacher
http://www.scriptindex.de/manuals/mysql/manual.de_MySQL_Database_Administration.html#Adding_users
Alle anderen Quellen haben den Befehl und seine Anwendung gar
nicht oder nur ungenau beschrieben und offensichtlich hat jeder
vom anderen abgeschrieben - ich hab's stundenlang mit grant
privileges file, grant privileges(file) usw. usf. probiert.
MySQL-Handbuch, Kapitel 5, Privileges provided by MySQL (zu finden by
dev.mysql.com, und online durchsuchbar!). Da steht laut und deutlich,
dass das FILE Privilege das ist, was Du brauchst.

Später heißt es zum SELECT-Befehl:

The SELECT ... INTO OUTFILE 'file_name' form of SELECT writes the
selected rows to a file. The file is created on the server host, so you
must have the FILE privilege to use this syntax.

Was genau soll denn bei
GRANT PRIVILEGE FILE ON *.* to ***@localhost;
nicht funktioniert haben?
Post by Hannes Birnbacher
@Christian: ja, danke, ein Pipe-Befehl wie der von Dir
dankenswerterweise vorgegebene ist das nächste, was ich probieren
wollte. Und nein, die vorhandenen Handbücher durchzulesen bzw.
nach dem Stichwort zu suchen, hat nichts gebracht
Ich habe Dir ja gerade vorgeführt, wo man den Kram finden kann.
Post by Hannes Birnbacher
(ausser
übrigens einem Angebot, wie man seinem Einkommen 'ne halbe Mio
Dollar hinzufügen kann, und wir lieben ja unsere amerikanischen
Spammer, die sich in allen möglichen Foren verewigen;-).
Keine Ahnung, was Du da machst. Mein MySQL-Handbuch enthält keinen Spam,
und der Kofler auch nicht.
Post by Hannes Birnbacher
Ein paar
Eindrücke über die praktische Nutzbarkeit diversester Manuals hab'
ich ja oben erbost wiedergegeben.
Du hast keine Lust Geld auszugeben, kaufst Dir eine schlechte
Übersetzung und beschwerst Dich genau *worüber*? Warum liest Du nicht
die einzige verbindliche Quelle zu einem Produkt, nämlich das Handbuch
des *Herstellers*?
Post by Hannes Birnbacher
Installiert ist PHP4 bei mir, aber auch wenn ich apache starte,
ohne weitere Konfiguration werden bei mir lokal keine .php Files
interpretiert <seufz>.
Am besten kaufst Du Dir ein vier Jahre altes von einem Koreaner aus dem
Japanischen ins Deutsche übersetzte Apache-Buch. Gehe auf keinen Fall zu
php.net oder apache.org, um die Originaldokumentation zu lesen.
Beschäftige Dich *nicht* mit dem Akronym LAMP.
Hannes Birnbacher
2005-07-22 09:04:49 UTC
Permalink
Antwort an Christian Kirsch auf die Nachricht von Fri, 22 Jul 2005
10:41:20 +0200
Post by Christian Kirsch
Und warum liest Du nicht einfach die MySQL-Dokumentation?
LESEN muss man
allerdings schon wollen.
Kann mal einer ein Followup setzen auf

news:wir-diskutieren-jetzt-die-kompetenz-von-hannes-birnbacher.de?

TIA
Post by Christian Kirsch
Super. Jetzt hast Du einen Benutzer ohne Passwort, der (fast)
alles auf Deiner Datenbank anrichten darf.
Tks für den Hinweis. "web" hat ein Passwort. Ich hoffe nicht, daß
ich diesen Schutz durch die Zuerkennung des file-Privileges
ausgehebelt habe. Darüberhinaus ist diese spezielle
Datenbankanwendung rein lokal, wobei ich mir zugegeben Mühe gebe,
in die Materie reinzukommen, um derlei Anwendungen auf meinem oder
meiner Kunden Webspace auch mal einzurichten.
Post by Christian Kirsch
Du hast keine Lust Geld auszugeben,
Ich habe kein Geld, mich mit allen möglichen Büchern zu
verlustieren;-)
Post by Christian Kirsch
Warum liest Du
nicht die einzige verbindliche Quelle zu einem Produkt, nämlich
das Handbuch des *Herstellers*?
Da steht nicht drin, was genau ich eintippen muß, um mein Problem
zu lösen <duck>.
Post by Christian Kirsch
Gehe
auf keinen Fall zu php.net oder apache.org, um die
Originaldokumentation zu lesen. Beschäftige Dich *nicht* mit dem
Akronym LAMP.
<grins> Auch hier wieder heissen Dank für die wohlverpackten
Hinweise;-).
--
Fossilienausstellung und mehr
im Brueckenhofmuseum Koenigswinter-Oberdollendorf
(Siebengebirge):
http://www.brueckenhof.de
Hannes Birnbacher
2005-07-22 10:03:19 UTC
Permalink
Antwort an Christian Kirsch auf die Nachricht von Fri, 22 Jul 2005
10:41:20 +0200
Post by Christian Kirsch
Und warum liest Du nicht einfach die MySQL-Dokumentation? Die
kostet überhaupt nix und das Englisch ist ok.
(stutz) Stimmt, und stimmt.

Man darf bloß nicht bei der deutschen Version landen. 13.5.1.3
"Grant and Revoke Syntax" steht in der deutschen Version unter
5.3.1 und ist lange nicht so klar formuliert...
--
Fossilienausstellung und mehr
im Brueckenhofmuseum Koenigswinter-Oberdollendorf
(Siebengebirge):
http://www.brueckenhof.de
Marian Heddesheimer
2005-07-22 08:52:48 UTC
Permalink
Post by Hannes Birnbacher
http://www.scriptindex.de/manuals/mysql/manual.de_MySQL_Database_Administration.html#Adding_users
Alle anderen Quellen haben den Befehl und seine Anwendung gar
nicht oder nur ungenau beschrieben und offensichtlich hat jeder
vom anderen abgeschrieben - ich hab's stundenlang mit grant
privileges file, grant privileges(file) usw. usf. probiert.
wobei man sagen muss, dass deine Quelle auch mit Vorsicht zu genießen
ist. Der Autor beschreibt hier, dass sich die User-Rechte auch mit
INSERT in die user-Tabelle einfügen lassen.

Das ist zwar technisch korrekt, sollte aber so in keinem Tutorial
stehen, weil gerade Anfänger damit eine Menge Unsinn anstellen können.
Für so etwas sollte man immer GRANT verwenden, wo es irgend möglich
ist.

Wo wir gerade bei der Qualität von Tutorials sind: In meinem
Online-Kurs

http://www.lernpilot.de/wbt/kurse/index.php?kurs=mysql01&inhalt=true&seite=0

gibt's eine ganze Lektion zur Rechteverwaltung, die ist allerdings
erst nach Anmeldung (und Bezahlung) zugänglich. Da wird das Ganze dann
nicht nur korrekt, sondern auch verständlich mit Beispielen erklärt.

Marian
--
Barrierefreie Online-Kurse: HTML, PHP, MySQL, Word, Excel
http://www.lernpilot.de/wbt/
Hannes Birnbacher
2005-07-22 08:57:24 UTC
Permalink
Antwort an Marian Heddesheimer auf die Nachricht von Fri, 22 Jul
2005 10:52:48 +0200
Post by Marian Heddesheimer
wobei man sagen muss, dass deine Quelle auch mit Vorsicht zu
genießen ist. Der Autor beschreibt hier, dass sich die
User-Rechte auch mit INSERT in die user-Tabelle einfügen lassen.
Das ist zwar technisch korrekt, sollte aber so in keinem
Tutorial stehen,
Klar. Ich war schon versucht, diesen Weg zu wählen, aber ich
dachte mir, sogar die dröge Verwaltungsoberfläche von MySql müsse
doch eine sicherere Methode bieten;-).
--
Fossilienausstellung und mehr
im Brueckenhofmuseum Koenigswinter-Oberdollendorf
(Siebengebirge):
http://www.brueckenhof.de
Christian Kirsch
2005-07-22 07:17:19 UTC
Permalink
Post by Hannes Birnbacher
Mit Eurer Hilfe (Danke!) hat nach nur einer Woche Arbeit der
Aufbau einer Datenbank für meine Zwecke geklappt, nur einen Tag
nach dem eigentlichen Abgabetermin für die Arbeit, die ich damit
erledigen wollte.
Jetzt würde ich natürlich gerne Abfragen irgendwie ausdrucken.
Abfragen? Oder ihre Ergebnisse?
Post by Hannes Birnbacher
Gibt es da einen besseren Weg als einen Screenshot?!
Ja.
Post by Hannes Birnbacher
Ich habe auf
meiner Linux-Maschine einen Benutzer "web", unter dem ich
Mysql aufrufe und auch die MySql-Datenbanken und
mysql> select * from teilgebiet into outfile
'/home/web/mysql/teilgebiet.txt';
Also willst Du offenbar das *Ergebnis* der Abfrage irgendwie
"ausdrucken". Warum benutzt Du nicht einfach eine Pipe dafür, wenn Du
schon unter Linux arbeitest:

mysql -e 'select ...' | lpr
Post by Hannes Birnbacher
"Die SELECT ... INTO OUTFILE 'datei'-Form von SELECT schreibt die
ausgewählten Zeilen in eine Datei. Die Datei wird auf dem
Server-Host erzeugt und darf nicht bereits bestehen (das
verhindert unter anderem, dass Datenbanktabellen und Dateien wie
/etc/passwd zerstört werden). Sie benötigen die file-Berechtigung
auf dem Server-Host, um diese Form von SELECT auszuführen."
Was wollen die mit letzterem Satz sagen?! Das Ziel-Directory
/home/web/mysql ist für "others" beschreibbar.
Du könntest ja mal das Wort "Berechtigung" in die Suchfunktion des
Manuals eingeben. Überhaupt würde es sich anbieten, das Handbuch zu
LESEN. Dafür ist es gedacht. Und durchaus von vorne bis hinten.
Irgendwas bleibt immer hängen.
Axel Schwenke
2005-07-22 07:51:37 UTC
Permalink
Post by Hannes Birnbacher
Jetzt würde ich natürlich gerne Abfragen irgendwie ausdrucken.
Gibt es da einen besseren Weg als einen Screenshot?!
Sicher.
Post by Hannes Birnbacher
mysql> select * from teilgebiet into outfile
'/home/web/mysql/teilgebiet.txt';
ERROR 1045: Access denied
"Die SELECT ... INTO OUTFILE 'datei'-Form von SELECT schreibt die
ausgewählten Zeilen in eine Datei. Die Datei wird auf dem
Server-Host erzeugt und darf nicht bereits bestehen (das
verhindert unter anderem, dass Datenbanktabellen und Dateien wie
/etc/passwd zerstört werden). Sie benötigen die file-Berechtigung
auf dem Server-Host, um diese Form von SELECT auszuführen."
Was wollen die mit letzterem Satz sagen?!
Daß der User 'web' die 'file' Berechtigung braucht:
-> http://dev.mysql.com/doc/mysql/en/privileges-provided.html

ABER: SELECT ... INTO OUTFILE ist ohnehin nicht das, was du suchst
Vermutlich willst du ja eine Ausgabe ähnlich wie im 'mysql' Client;
hypsch eingerückt in Tabellenform.

Dazu kannst du zum einen den Batch-Modus von mysql nutzen:

~ $mysql test -e "show tables" >test1.txt
~ $cat test1.txt
Tables_in_test
sequence
~ $mysql test -e "show tables" -v -v -v >test2.txt
~ $cat test2.txt
--------------
show tables
--------------

+----------------+
| Tables_in_test |
+----------------+
| sequence |
+----------------+
1 row in set (0.00 sec)

Bye

Oder du schaltest einfach die Protokollierung in mysql ein:

~ $mysql test
Your MySQL connection id is 26640 to server version: 4.1.7

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> tee test3.txt
Logging to file 'test3.txt'
mysql> select * from sequence;
+------+-------+
| name | value |
+------+-------+
| foo | 1 |
+------+-------+
1 row in set (0.00 sec)

mysql> Bye
~ $cat test3.txt
mysql> select * from sequence;
+------+-------+
| name | value |
+------+-------+
| foo | 1 |
+------+-------+
1 row in set (0.00 sec)

mysql> ~ $


XL
Loading...