2009-05-20 6 views

Antwort

3

Ich würde empfehlen, den Befehl wget in einer Subshell zu starten, damit Sie sicherstellen können, dass er abgeschlossen ist, bevor Sie Ihren mysql-Befehl ausführen. In bash geschieht dies mit Klammern.

Verwenden Sie auch &&, damit der Befehl mysql nur ausgeführt wird, wenn der Befehl wget einen Erfolgsstatus hat.

#!/bin/sh 
(
    wget "http://domain/file.zip" && mysql -u user -ppassword database -e "UPDATE..." 
) & 

Setzen Sie das Passwort im Klartext in dem Skript ist not necessarily a good idea, weil es in einem ps Eintrag angezeigt werden kann.

Stattdessen können Sie sich auf den [client] Abschnitt in Ihrer ~/.my.cnf Datei verlassen. Sie können auch die Umgebungsvariable MYSQL_PWD verwenden. Jede dieser Lösungen bedeutet, dass in der Befehlsliste kein Kennwort angezeigt wird.

+0

Beachten Sie auch, dass Bash das Ganze automatisch in eine Subshell legt, egal ob Sie {..} & oder (..) & – lhunath

+0

verwenden. Das Problem besteht nicht darin, das Passwort in das Skript zu schreiben (das kann korrekt mit dem richtigen Befehl gesichert werden) Berechtigungen), es setzt das Passwort auf die Kommandozeile, damit jeder es sehen kann (wo jeder meint, jemand, der 'ps' ausführen kann oder einen anderen Weg findet, die Prozessliste abzufragen, zB durch Ausnutzen eines Fehlers auf dem Webserver). Nenne dieses wichtige Sicherheitsproblem stärker und du bekommst +1 von mir. – lhunath

+0

@lhunath: Ja, guter Punkt über die PS-Auflistung. Obwohl ich von der Frage des OPs ausgehe, gehe ich nicht davon aus, dass auf diesem Rechner irgendein Webserver beteiligt ist. –

0

Nun, Sie könnten es einfach in ein Shell-Skript einfügen.

Ich weiß nicht, enlough über Shell Ihnen sagen, wie wenn

0

Warum file_get_contents oder curl nicht verwenden, um die Datei in PHP herunterladen?

$data = file_get_contents('http://domain/file.zip'); 
file_put_contents('file.zip', $data); 
mysql_query("UPDATE table SET status = 'live' WHERE id = '1234'"); 
+0

Die Dateien sind unglaublich groß und wir machen mehrere Downloads gleichzeitig. wget ist erforderlich, damit es im Hintergrund heruntergeladen werden kann und nicht auf ein PHP-Skript angewiesen ist. –

0

Sie können Skript es in Python so ...

#!/usr/bin/python 
import sys, MySQLdb, urllib 

urllib.urlretrieve(sys.argv[1], sys.argv[2]) 
db = MySQLdb.connect(host="localhost", user="username", passwd="password", db="database") 
cursor = db.cursor() 
cursor.execute("UPDATE table SET status = 'live' WHERE id = '1234'") 

Dies nimmt die Quell-URL als erstes Argument und dem Zieldateinamen wie die zweite. Beachten Sie, dass dies Pythons eigene URL-Retrieval-Bibliothek urllib verwendet. Wenn Sie aus irgendeinem Grund wget verwenden müssen, könnten Sie das Modul 'os' importieren und os.system ('Ihre Befehlszeile') verwenden.

In Unix das Skript im Hintergrund 'scriptname.py Python &' ausführen können, indem Sie

1

wget http://domain/file.zip && mysql -u user -ppassword database -e "UPDATE table SET status = 'live' WHERE id = '1234'"

+0

Sie möchten Ihr Kennwort je nach System möglicherweise nicht direkt in die Befehlszeile eingeben. – user84643

+0

mysql -u Benutzer --password = 'Katze my_secret_password.txt' Datenbank ... –

+0

@Max Kosyakov: Sie sind irreführend, was Sie versuchen, sicher zu halten. Das Passwort in einer Skriptdatei oder in einer separaten Passwortdatei zu speichern ist wirklich nicht anders. Beide Dateien können ordnungsgemäß mit Berechtigungen gesichert werden. Das PROBLEM ist, dass Sie NIEMALS Passwörter in ** Argumente zu Befehlen ** setzen sollten. Und du machst das immer noch. Alle Befehle sind für jeden sichtbar, der genug Fähigkeiten besitzt, um einen Server dazu zu bringen, ihnen eine Prozessliste zu zeigen (nein, er braucht wirklich keinen SSH-Zugriff). – lhunath

1

In bash wäre es wahrscheinlich so einfach sein wie:

#!/bin/bash 
wget -q http://domain.tld/file.zip || exit 0 
/usr/bin/php somefile.php 

Mit die .php-Datei, die Ihre MySQL-Abfrage enthält.

Sie können die MySQL-Anweisung auch direkt über den MySQL-Client (der bereits veröffentlicht wurde) ausführen, aber Sie sollten Ihr MySQL-Passwort in Ihrem syslog/history nicht beachten.