2009-05-20 6 views

Répondre

3

Je vous recommande de lancer la commande wget dans un sous-shell afin de vous assurer qu'elle se termine avant d'exécuter votre commande mysql. En bash, cela se fait avec des parenthèses.

Utilisez également && pour que la commande mysql s'exécute uniquement si la commande wget a un statut de sortie réussie.

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

Mettre le mot de passe en texte clair dans le script est not necessarily a good idea car il peut être vu dans une liste ps. Au lieu de cela, vous pouvez compter sur la section [client] de votre fichier ~/.my.cnf. Vous pouvez également utiliser la variable d'environnement MYSQL_PWD. Chacune de ces solutions signifie qu'il n'y a pas de mot de passe visible dans la liste des commandes.

+0

Notez également que bash va automatiquement mettre le tout dans un sous-shell si vous utilisez {..} & ou (..) & – lhunath

+0

Le problème n'est pas autant de mettre le mot de passe dans le script (qui peut être correctement sécurisé en utilisant correct permissions), il met le mot de passe sur la ligne de commande pour que tout le monde puisse voir (où tout le monde veut dire, quelqu'un capable d'exécuter 'ps' ou trouver un autre moyen d'interroger la liste des processus par exemple en exploitant un bogue sur votre serveur web). Menez cet important problème de sécurité plus fort et vous obtenez un +1 de moi. – lhunath

+0

@lhunath: Oui, bon point sur la liste ps. Bien que de la question de l'OP, je ne suppose pas qu'il y ait un serveur Web impliqué sur cette machine. –

0

Eh bien, vous pouvez simplement le mettre dans un script shell.

Je ne sais pas enlough sur Shell pour vous dire comment se

0

Pourquoi ne pas utiliser file_get_contents ou curl pour télécharger le fichier à partir de PHP?

$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

Les fichiers sont incroyablement grands et nous faisons plusieurs téléchargements à la fois. wget est requis pour qu'il se télécharge en arrière-plan et ne repose pas sur un script PHP. –

0

Vous script peut en Python ainsi ...

#!/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'") 

Cela prend l'URL source comme premier argument et le nom du fichier de destination en tant que deuxième. Notez que ceci utilise la bibliothèque urlib de récupération d'URL de Python, si pour une raison quelconque vous devez utiliser spécifiquement wget, vous pouvez importer le module 'os' et utiliser os.system ('votre ligne de commande').

En unix vous pouvez exécuter le script en arrière-plan en tapant 'python scriptname.py &'

1

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

+0

Bien que, selon le système, vous ne souhaitiez pas mettre votre mot de passe directement sur la ligne de commande. – user84643

+0

mysql -u utilisateur --password = 'cat my_secret_password.txt' base de données ... –

+0

@Max Kosyakov: Vous êtes induit en erreur quant à ce que vous essayez de garder en sécurité. Mettre le mot de passe dans un fichier de script ou dans un fichier de mot de passe séparé n'est vraiment pas différent. Les deux fichiers peuvent être correctement sécurisés avec des autorisations. Le PROBLÈME est que vous ne devriez JAMAIS mettre des mots de passe dans ** arguments aux commandes **. Et tu fais toujours ça. Toutes les commandes sont visibles par tous ceux qui ont assez de compétences pour convaincre un serveur de leur montrer une liste de processus (non, il n'a vraiment pas besoin ** d'un accès ssh). – lhunath

1

En bash, il serait probablement aussi simple que:

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

Avec le fichier .php contenant votre requête MySQL.

Vous pouvez également exécuter l'instruction MySQL directement via le client MySQL (qui a déjà été publié), mais vous devriez vous méfier d'avoir votre mot de passe MySQL dans votre syslog/historique.

Questions connexes