[MySQL]: Access denied in Skripten

Enumerator

Mitglied Kamel
Hi!

Ich wollt' mal eben ein PostgreSQL-Skript nach MySQL übersetzen, doch irgendwie lässt man mich nicht hinein... Versuche ich mich über die Shell einzuloggen habe ich keine Probleme, doch mein sonst so bequemer Trick mit der Shebang-Zeile will einfach nicht funktionieren:

Code:
~$ mysql --password=local --database=develop
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 16
Server version: 5.0.83 OpenBSD port: mysql-server-5.0.83

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> exit;
Bye
~$
~$ head -1 update.mysql
#!/usr/local/bin/mysql --password=local --database=develop
~$ ls -l update.mysql
-rwx------   1   enum    wheel     3061   Sep 20 21:01  update.mysql
~$ ./update.mysql
ERROR 1045 (28000): Access denied for user 'enum'@'localhost' (using password: YES)
~$
Ist das ein vielleicht etwas zu gut gemeintes Sicherheits-Feature oder bin ich mal wieder Betriebsblind?

Gruß
Enum
 
Hallo,

der Trick funktioniert deshalb nicht:
Code:
reima@marvin:~$ man execve
…

DESCRIPTION
       execve() executes the program pointed to by filename.  filename must be
       either a binary executable, or a script starting with  a  line  of  the
       form:

           #! interpreter [optional-arg]

       For details of the latter case, see "Interpreter scripts" below.

…

       The  semantics  of  the  optional-arg argument of an interpreter script
       vary across implementations.  On Linux, the entire string following the
       interpreter name is passed as a single argument to the interpreter, and
       this string can include white space.  However, behavior differs on some
       other  systems.   Some  systems  use the first white space to terminate
       optional-arg.  On some systems, an interpreter script can have multiple
       arguments,  and  white  spaces  in optional-arg are used to delimit the
       arguments.
mysql erhält als einzigen Parameter also „--password=local --database=develop“ und interpretiert das als „das Passwort lautet ›local --database=develop‹“.

Was genau hast du eigentlich vor? Wenn in deiner update.mysql SQL-Anweisungen stehen, würden diese nicht ausgeführt werden, selbst wenn der Aufruf klappen würde. mysql akzeptiert nämlich keinen Dateinamen als Argument.

Grüße,
Matthias
 
Hallo Mathias,

danke, das erklärt alles. Mit Postgres hat es also funktioniert weil ich da kein Passwort angeben brauchte, sondern nur die Datenbank, sprich nur einen Parameter benötigt habe.
Das mit dem Dateinamen war mir auch klar, aber die Datei mit der Shebang-Zeile enthält ja selbst die SQL-Satements und wird von der Shell via STDIN weitergereicht...
Nun denn, da es sich eh nur um eine Bequemlichkeit auf dem lokalen Test-System handelt werde ich wohl einfach das Passwort für 'enum'@'localhost' deaktivieren.

Gruß
Enum
 
Das mit dem Dateinamen war mir auch klar, aber die Datei mit der Shebang-Zeile enthält ja selbst die SQL-Satements und wird von der Shell via STDIN weitergereicht...
Nein, eben nicht. Bei der Shebang-Zeile…
Code:
#!/usr/local/bin/mysql --database=develop
…in der Datei update.mysql würde beim Aufruf ./update.mysql folgender Befehl abgesetzt werden:
Code:
/usr/local/bin/mysql --database=develop ./update.mysql
Auf STDIN wird nichts geschrieben.

Es wäre aber ein leichtes, ein entsprechendes Wrapper-Skript zu schreiben:
Bash:
#!/bin/sh
# Dateiname: /usr/local/bin/mysqlexecfile.sh
/usr/local/bin/mysql $1 <"$2"

Code:
#!/usr/local/bin/mysqlexecfile.sh --password=local --database=develop
# Dateiname: update.mysql
UPDATE …

Grüße,
Matthias
 

Neue Beiträge

Zurück