Nachdem ich das Problem mit der Verwendung eines Kennworts in der Befehlszeile verstanden habe , muss ich einen Weg finden, ein Programm mit einem Kennwort zu füttern, ohne dass dies ein Problem darstellt (ohne dass das Kennwort irgendwo aufgezeichnet wird).
Ich habe ein Bash-Skript, das automatisch einen gesamten LAMP-Server von der Quelle installiert: Apache, FastCGI, PHP und MySQL. Diese Installationen erfordern ein Passwort, insbesondere MySQL.
Wie kann ich das Skript vollständig automatisieren, ohne das Passwort preiszugeben?
Bearbeiten (9. Juni, 3:55 UTC):
Ich rufe MySQL mit einem Passwort in der Befehlszeile über root auf:
root@dor-desktop:/home/dor# PASS=`cat /home/dor/tmpf/pass`
root@dor-desktop:/home/dor# mysql -u root -p"$PASS"
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
(PASS = "p4ssw0rd" in unserem Fall)
Und ich führe ps aux | grep mysql
über meinen regulären Benutzer (dor) aus, der mir das Passwort nicht anzeigt !
(Einige von) ps
Ausgaben sind:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3562 0.0 0.0 34156 2864 pts/0 S+ 05:53 0:00 mysql -u root -px xxxxxx
Wie ist das möglich?
Antworten:
In Bezug auf Ihr Update:
Wenn ein Prozess gestartet wird, verfügt er über einen dedizierten Speicherbereich, in dem Argumente gespeichert sind, und ein int, das angibt, wie viele Argumente übergeben wurden.
MySQL prüft, ob das Kennwort in der Befehlszeile von übergeben
-p
wurde und ob es in eine neue Variable kopiert wurde, die nicht sichtbar ist, und überschreibt diesen Speicherbereich mitx
'es.In einfachen Worten zB:
Sie finden es zB im
client/mysqladmin.cc
Quellcode:Beim
ps
Ausführen liest es den Speicherbereich der Argumente (argv[N]
) und ist es somitxxxx
.Für eine sehr kurze Zeit ist das Passwort sichtbar, aber nur für einige CPU-Zyklen.
Sie können das MySQL-Passwort mithilfe der speziellen
--init-file
Option und Prozedur aktualisieren . C.5.4.1.2. Zurücksetzen des Root-Passworts: Unix SystemsBearbeiten:
Wie @Gilles sagen, können Sie
echo
,printf
oder die Verwendunghere
Dokument aus einem Skript.Sie können dies auch zu
.my.cnf
Ihrem Home-Verzeichnis oder in einer ( temporären ) Datei hinzufügen und die--defaults-extra-file
Option verwenden. (Glauben Sie, dass Sie diese Option früh in der Befehlszeile hinzufügen müssen.) Optional auch Benutzer einschließen. Beachten Sie auch das Extra im Optionsnamen, es sei denn, Sie möchten nur diese Datei als Konfiguration verwenden:Optional überspringt die
[client]
Gruppierungmysqld
die Konfiguration.Man kann auch
MYSQL_PWD
Umgebungsvariablen verwenden, aber das sollte niemals verwendet werden, da man die Umgebung in vielenps
Implementierungen vonps -e
in der/proc/<PID>/environ
Datei unter Linux usw. auflisten kann.Mehr zum Thema hier .
Vielleicht möchten Sie auch einen Blick auf das MySQL-Konfigurationsdienstprogramm werfen, mit dem Sie das Kennwort in einer verschlüsselten Datei in Ihrem Home-Verzeichnis speichern können
.mylogin.cnf
.quelle
mysql-init
Datei mit dem Kennwort zu ändern , das in einer Bash-Variablen gespeichert ist? (ohne enthüllt zu werden)echo 'password=p4ssw0rd' >>mysql.cnf
ist sicher, da es integriertecho
ist, sodass das Kennwort in keinem Befehl in der Befehlszeile angezeigt wird. Ein hier Dokument ist auch sicher.Die typische Lösung besteht darin, das Kennwort aus einer Datei oder aus der Standardeingabe (oder aus einem anderen Dateideskriptor, der als Parameter übergeben werden müsste) zu lesen.
quelle
Einige Programme (
ftp
z. B. die Befehlszeile ) lesen Kennwörter aus/dev/tty
der prozessspezifischen Spezialdatei, die den Prozess darstellt, der TTY steuert. Auf diese Weise kann das Programm das Kennwort nicht an den Bildschirm zurücksenden und ein wenig mehr Sicherheit darüber haben, woher das Kennwort stammt.quelle