IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Insérer une variable Bash dans une requête sql


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 19
    Par défaut Insérer une variable Bash dans une requête sql
    Bonjour à tous, Je souhaite récupérer les adresses Ips qui se sont connectés à mon serveur Apache et les stockées dans ma base de données SQLserver (J'utilise ODBC)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ipConnect=$(cat /var/log/apache2/access.log | cut -f1 -d' ' | sort | uniq) #la commande me donnant les ips (sans doublons) stockée dans la variable ipConnect
    echo -e "INSERT INTO dbo.Logs (ipLog) VALUES ('$ipConnect');" | isql DATABASE MDP LOG -v
    la connexion se réalise, mais insère des champs vides dans la base de données puisque la variable n'est pas prise en compte en SQL, je voulais connaitre votre avis pour savoir si c'est bien un problème de lecture de la variable et comment résoudre le problème.
    Merci pour la réponse !!!!

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour,

    Pour le mot clé VALUES, le séparateur n'est pas l'espace (mais la virgule ou le point-virgule, je ne sais plus). Pourtant, dans ta variable, aucune virgule ou point-virgule.

    Ensuite, il faudrait vérifier que isql accepte qu'on lui mette un fichier en entrée. Rien n'est moins sûr. Il sera peut-être nécessaire d'utiliser While do done < <() ou alors xargs -ITT commande TT.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 19
    Par défaut
    Merci pour cette réponse, du coup j'ai pris en compte vos remarques et je me dis qu'il faudrait mieux que je stocke chaque Ips dans des variables différentes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ipConnect=$(cat /var/log/apache2/access.log | cut -f1 -d' ' | sort | uniq)#toutes les adresses qui se sont connectées au serveur
    nbrConnect=$(echo "$ipConnect" | wc -l)#nombres de connections au serveur
    i=1
    while [ "$i" -le "$nbrConnect" ]#tant que i<aux nombres de connections (soit aux nombres de lignes de la variable ipConnect)
    do
    ip"$i"=$(echo "$ipConnect" | grep -E ^"$i")#la variable ipN stockera la N ème lignes d'adresses <== cette commande ne marche pas 
    echo "ip$i"#on affiche le resultat afin de vérifier si la commande fonctionne
    echo -e "INSERT INTO dbo.Logs (ipLog) VALUES ('$ip"$i"');" | isql DATABASE MDP LOG -v 
    i="$i"+1
    done
    la je sépare les adresses, comme ça j'aurais un champ=une adresse dans ma BDD, mais les variables Bash ne sont pas prisent en compte dans le SQL ...

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 644
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 644
    Par défaut transformer une liste/tableau en "variable CSV"
    il faudrait mieux que je stocke chaque Ips dans des variables différentes
    très mauvaise idée

    un tableau pourrait aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sep=#définir virgule ou point-virgule
    ar=( $(cut -f1 -d' ' /var/log/apache2/access.log | sort -u) )
    oIFS="$IFS"; IFS="$sep"; printf -v values "${ar[*]}"; IFS="$oIFS"
    echo "$values"
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 19
    Par défaut
    ah bah oui c'est propre comme ça ...
    Du coup une fois que mes Ips seront dans le tableau, je pourrais directement les insérer dans ma BDD avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO dbo.Logs (ipLog) VALUES ('$values');
    Et la variable values sera bien pris en compte par sql ? enfin ça ne sera pas des champs vides que SQLserver va me créer ?
    Bon bah je testerais ça demain ! merci beaucoup!

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Personnellement, je prendrais la sortie de la liste des IPs et j'en ferais un texte bien formaté pour le passer à la commande isql. Mais j'ai l'impression de me répéter.

    Utiliser des quotes plutôt que des double quotes me semble une mauvaise idée.

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 644
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 644
    Par défaut
    avec des guillemets (double-quotes) autour, pas de problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ var="la la"
    $ echo "tra '$var' lère"
    tra 'la la' lère
    $ echo tra '$var' lère
    tra $var lère
    par contre l'option -e n'est peut-être pas souhaitable (elle active l'interprétation des caractères d'échappement). Ce comportement ne pourrait-ils poser des problèmes ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 19
    Par défaut
    Mais enfaite c'est pas possible d'insérer toutes mes données sans faire de boucle .. si je rentre une ip ça fonctionne mais la il y a plusieurs valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo -e "INSERT INTO dbo.Logs1 (ipLog) VALUES ('$values');" | isql DATABASE LOG MDP -v
    je vais inséré toutes mes ips avec une virgule puisque sep=,
    on aura genre "INSERT INTO dbo.Logs1 (ipLog) VALUES ('192.168.10.105,192.168.10.107,192.10.135');" mais la ma base de données va comprendre que je souhaite inséré ces données dans un seul champs non ? mais après mon problème de départ est résolut puisque un tableau bash est bien en compte dans ma requête sql ! Merci pour ces réponses

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 19
    Par défaut j'ai rien dit..
    c'est bon mon problème est résolut !! ça marche impec, j'ai simplement fait ma requête SQL dans une boucle while! MERCI

  10. #10
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    La boucle est inutile puisque VALUES peut prendre plusieurs enregistrement d'un coup.

    Mais comme tu as résolu le problème, c'est bon.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/06/2009, 10h54
  2. [Système] Une variable PHP dans une commande bash
    Par aroua dans le forum Langage
    Réponses: 1
    Dernier message: 19/07/2007, 16h23
  3. Réponses: 1
    Dernier message: 20/04/2007, 09h12
  4. [PHP-JS] mettre une variable javascript dans une variable php
    Par Mounr dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/04/2007, 09h09
  5. récupérer une variable javascript dans une variable java
    Par tx dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/07/2006, 17h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo