Script shell/bash pour recuperer des infos sur un pc a distant

Résolu
c199 Messages postés 28 Statut Membre -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour

Je connais rien en shell ou bash .Je suis en stage et mon tuteur me demande de créer un script shell ou bash pour récupérer les informations d'un pc à distance :
  • sa config
  • son nombre de cœurs
  • son adresse IP
  • la quantité de RAM
  • nom de l'ordinateur / type cpu (version)


Pour le déployer depuis mon ordinateur, et ensuite de stocker toutes ses informations dans un log ou une base de données.

Merci d'avance

15 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    À lire… merci ;-))
    1
  2. c199 Messages postés 28 Statut Membre
     
    ok dacc
    alors on peut me donner des axes de recherches
    svp
    merci d'avance
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Dès que tu nous aura montré ce que tu as déjà trouvé (commandes en rapport avec ce qui t'est demandé), on t'aidera…
      0
  3. c199 Messages postés 28 Statut Membre
     
    CE QUE JAI TROUVE SUR LE NET


    #!/bin/bash

    ## INFOS
    zenity --info --title='iZard version O.2 Alpha' --text="<b>Ce logiciel se charge de vous donner un maximum d'information sur votre ordinateur</b>
    _______________________________________________________________________________________________________

    <b>Informations générales</b>
    Nom de l'ordinateur : `uname -n`
    Système d'exploitation : `uname -o`
    Version du noyau Linux : `uname -r`
    Structure du processeur : `uname -m`

    Système d'exploitation : `lsb_release -a | grep Distributor | cut -f 2` ## première modif ##
    Version du système : `lsb_release -a | grep Release | cut -f 2` - `lsb_release -a | grep Codename | cut -f 2` ## deuxième modif ##

    <b>Carte Graphique</b>
    Accélération Graphique : `glxinfo | sed -n "s/direct rendering: //p"`
    ID et Nom de la carte graphique : `lspci | grep VGA | cut -d : -f 3` ## dernière modif ##

    <b>Processeur(s)</b>
    `cat /proc/cpuinfo | grep vendor_id | sed "s/vendor_id :/Marque : /g"`
    `cat /proc/cpuinfo | grep bogomips | sed "s/bogomips :/Bogomips : /g"`
    `cat /proc/cpuinfo | grep model | sed "s/model :/Numéro du model : /g" | sed "s/model name :/Nom du model : /g"`
    `cat /proc/cpuinfo | grep MHz | sed "s/cpu MHz :/Fréquence du (des) processeurs : /g"`
    `cat /proc/cpuinfo | grep cache | sed "s/cache size :/Taille du cache : /g"`"

    ##

    Système d'exploitation : `lsb_release -i | grep Distributor | cut -f 2`
    Version du système : `lsb_release -r | grep Release | cut -f 2` - `lsb_release -c | grep Codename | cut -f 2`

    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Merci.

      Et donc ??? Qu'est-ce que tu as pondu qui correspond à ta demande ?
      0
  4. c199 Messages postés 28 Statut Membre
     
    prendre des infos d'un ordi mais comme je le disais
    apres je cherche juste des aiguillemts de OU chercher mes infos pour faire le travail
    je sais que c'est pas dans l'ordre mais pour l'instant jai juste des commandes de comment recuperer certains infos
    je sais aussi que jai meme pas le debut mais je sais que jai un commencement

    donc malgre tout ca si vous pouvez juste m'aiguiller ?
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Dans le script que tu as trouvé sur la toile, tu as certaines commandes qui donnent quelques uns des résultats attendu par ton maître de stage.

      Pour t'aiguiller, ces commandes se trouvent entre quotes inverses ( `...` ).
      Tu copies/colles (ou recopies) ces commandes¹ dans un terminal (sans les quotes inverses) sur ton système GNU/Linux, et tu vois ce quelles retournent.

      N'oublie pas que pour chaque commande, il existe une page de "man" associée (
      man commande
      ) qui te donneras l'explication sur la commande et la syntaxe pour l'utiliser.



      ¹ Une par une et tu essaies de comprendre ce qu'elles font et te renvoient.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. c199 Messages postés 28 Statut Membre
     
    jai aussi trouve une fonction "dmidecode" je voulais savoir est ce que c'etait bien et comment je pouvais l'utiliser ?
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Dans un terminal tape
      man dmidecode
      tu auras toutes les options possibles pour l'utiliser.
      0
  7. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bonjour c199

    Comme le dit zipe31, il faut forger pour devenir forgeron. Te donner les réponses ne t'aidera pas à trouver. Mais tes recherches ont déjà porté leur fruit puisque le script que tu as trouvé liste quelques unes des commandes dont tu auras besoin.

    Pré-requis

    Commence par te familiariser avec le shell. Tu ne peux pas t'exprimer dans une langue avant de l'avoir apprise.

    Donc un tutoriel de base serait un bon début, pour voir comment taper des commandes, comment écrire un premier script etc.

    Commence par du simple (comment lancer une commande, comment écrire dans le terminal) puis augmente le progressivement la difficulté (comment faire un test, comment faire une boucle...). Tu peux par exemple regarder ce tutoriel mais n'hésite pas à en chercher d'autres.

    Démarche générale

    1) Cherche la commande qui te donnera des infos sur ce que tu veux. Une recherche google t'y aidera. Par exemple dans le script que tu as trouvé,
    cat /proc/cpuinfo
    liste les infos sur les CPUs du PC. Généralement tu peux trouver des informations dans
    /etc
    (configuration),
    /proc
    (état du noyau),
    /var/
    (état des applications), ou au travers de commandes d'administration dédiées (
    ps
    ,
    ip
    ,
    netstat
    , etc.)

    2) Extraie de ce résultat la partie qui t'intéresse. Des commandes telles que
    grep
    ,
    wc
    ou
    cut
    t'y aideront. Le
    man
    correspondant t'y aidera (par exemple tape dans un terminal
    man wc
    , q pour quitter) À ce stade commence par voir si tu arrives à écrire dans le terminal un résumé des informations ainsi extraites.

    3) Si tu parviens à écrire dans un terminal, écrire dans un fichier de log serait aisé. On verra plus tard comment interagir avec une base de données, mais encore faudrait il préciser laquelle (mysql, postgresql, etc...), le schéma choisi, etc. Bref je te conseille de laisser ce côté pour plus tard et de te concentrer d'abord sur la partie shell.

    4) Si tu parviens à faire marcher ton script en local, il sera possible de le copier sur les machines à inspecter et l'exécuter sur chacune d'elle. Ici il faudrait préciser comment est initialisé cette analyse. Notamment, comment se connecte-t'on au machine analysées (en ssh ?). Qui initie cette analyse ? Chaque machine, périodiquement (e.g. grâce à
    anacron
    ) ou un moniteur (e.g. grâce à
    parallel-ssh
    ) ?

    Exemple : nombre de cœurs

    Afin de te guider, je te montre comment on arrive au nombre de cœurs car tu y es presque. Ensuite essaye de reproduire la démarche pour le reste.

    1) L'état du système est maintenu par le noyau linux dans
    /proc
    . On le sait car c'est stipulé dans la FHS. En fouillant ce répertoire, on trouve un fichier dont le nom est suspect :
    /proc/cpuinfo
    .

    2) La commande
    cat
    retourne la concaténation du contenu de plusieurs fichiers. Quand il n'y en a qu'un, cela revient à écrire son contenu dans la sortie standard. Si la commande est lancée dans un terminal, cela affiche donc le contenu du fichier dans le terminal, et on peut exploiter ce résultat en faisant des pipes (prononcer païpe).

    À ce stade la commande est donc :

    cat /proc/cpuinfo


    En regardant ce que ça retourne, on voit que les processeurs sont identifiés (voir ligne
    processor : ...
    ) donc ces lignes permettent de déterminer combien il y en a :

    cat /proc/cpuinfo | grep "processor"


    Par exemple sur ma machine, j'obtiens :

    (mando@silk) (~) $ cat /proc/cpuinfo | grep processor
    processor : 0
    processor : 1
    processor : 2
    processor : 3


    Il suffit donc de compter le nombre de lignes pour savoir le nombre de cœur. Ceci peut être réalisé avec la commande
    wc
    et comme l'indique
    man wc
    , avec l'option
    -l
    . On obtient alors :

    (mando@silk) (~) $ cat /proc/cpuinfo | grep processor | wc -l
    4


    On peut éventuellement produire un message en injectant ce résultat dedans :

    (mando@silk) (~) $ echo "La machine a" $(cat /proc/cpuinfo | grep processor | wc -l) "CPUs"
    La machine a 4 CPUs


    Remarque : La syntaxe
    $( ... )
    est spécifique à bash, un shell particulier. Pour rester générique tu peux utiliser
    ` ... `
    (backquotes) à la place.

    Bonne chance
    0
  8. c199 Messages postés 28 Statut Membre
     
    merci je vous montrerai mon scrypt quand jaurai plus avance sur mes recherche
    0
    1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
       
      Oui alors sinon ça s'écrit "script" :-)
      Merci de soigner l'orthographe (pluriels, ponctuation, etc), on n'est pas sur facebook :-)
      0
  9. c199 Messages postés 28 Statut Membre
     
    j'ai beaucoup avancé sur ce script voila mes dernière trouvailles


    #!/bin/bash
    #info report sur ordi
    #creation fichier log

    #info sur @ip
    echo " @ip est " $(ifconfig | grep inet | grep netmask | grep broadcast)

    #info nom de machine
    echo " le nom de la machine est :" $(cat /etc/hostname)

    #info RAM
    echo "RAM :" $(free -h)

    #x32/64 BITS
    echo " cette version est :" $(arch) "BITS"

    #nb de COEUR + model
    echo "la machine a " $(cat /proc/cpuinfo | grep processor | wc -l) "coeur"
    echo "le model " $(cat /proc/cpuinfo | grep ' model name')


    il veut que je fasse une question au début du script pour demander sur quel ip je veux me connecter .Ensuite ça se connecte en ssh(l'@ip ça doit être une variable | pour la connexion en ssh) et lance ce script ci-dessus puis sa fait un transfère de fichier vers un serveur NAS avec des login(du coup a mon avis je dois créer des variables pour ça) et a la fin sa doit se déconnecter du ssh et mettre fin au script

    comment faire ou plutôt ou chercher ?
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      Félicitations, tu as bien bossé.

      On va commencer par corriger ou améliorer quelques unes de tes commandes…

      Pour l'IP, pas la peine de chercher avec 3 motifs, d'autant plus qu'ils sont sur la même ligne, donc un seul suffit, mais pas n'importe lequel, sinon tu vas remonter des infos inutiles (comme l'interface local (lo)). Le plus pertinent semble être le "broadcast" à mon avis.
      Donc un petit serait pas mal :
      $ ifconfig | egrep -o '\b.*broadcast [^ ]*'
      inet 192.168.10.80 netmask 255.255.255.0 broadcast 192.168.10.255
      inet 192.168.200.120 netmask 255.255.255.0 broadcast 192.168.200.255

      Mais, la commande
      ifconfig
      tend à devenir désuette, il est préférable de lui préférer la commande "
      ip
      " :
      $ ip a | grep -o 'inet.*brd [[:digit:]\.]*'
      inet 192.168.10.80/24 brd 192.168.10.255
      inet 192.168.200.120/24 brd 192.168.200.255


      Idem pour le nom de la machine, il existe une commande native (
      hostname
      ) pour ça (pas la peine de faire appel à la commande
      cat
      ) :
      $ hostname
      Aspire


      Pour le nombre de cœurs, plutôt écrire la commande comma ceci :
      $ echo "la machine a $(cat /proc/cpuinfo | grep processor | wc -l) coeur(s)"
      la machine a 4 coeur(s)


      Pour la suite de ton exercice, notamment pour le menu, il existe une commande interne au bash qui s'appelle
      select
      (
      man bash
      ou help select pour plus d'infos).

      Voilà ce qu'on peut faire avec :



      Le code que j'ai utilisé :
      #! /bin/bash
      # Nettoyage de l'écran
      clear
      
      # Initialisation liste IP
      set 192.168.10.77 192.168.10.203 192.168.10.201 192.168.10.204
      
      # Définition du prompt de select
      PS3="Faites votre choix : "
      
      # Affichage de la liste et exécution des commandes
      echo "Liste des IP :"
      select adress in $@
      do
      echo "Vous avez choisi l'adresse : ${adress}"
      echo
      echo "Vérifions si cette adresse est en écoute sur le réseau…"
      echo "ping -c1 ${adress}"
      sleep 2
      ping -c1 "${adress}"
      echo
      break
      done
      


      Pour les connexions ssh, on verra plus tard.
      0
  10. c199 Messages postés 28 Statut Membre
     
    on est en réseau avec plus de 700 poste avec un sous reseau par local
    je veux pas toute les mettre dans mon script
    IP: 10.66.||sous-réseau||POSTE

    j'ai pas envie de noter les 700 @ip
    mais juste l'@ip du poste qu'il veut la config
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Je ne t'ai donné qu'un exemple, sans connaître tes besoins réels. C'est à toi d'adapter !
      0
  11. c199 Messages postés 28 Statut Membre
     
    MON NOUVEAU CODE



    #!/bin/bash
    #info report sur ordi
    #création fichier log

    #connaitre @ip pour subnet
    read -p 'quel @ip interroger ?' ip

    #variable prédéfini pour mot de passe du ssh
    mdp='Password!'

    #vérification des login et mot de passe
    echo "le login est : $ip"#sa sera @ip quon as mit au prompt#
    echo "le mot de passe est : $mdp"

    #connexion ssh
    echo $(ssh -a -4 root@$ip)
    #POUR LE MOT DE PASSE J'ARRIVE pas A TROUVER UN MOYEN de le rentrer automatiquement#

    #info sur @ip
    echo " @ip est " $(ip a | grep -o 'inet.*brd [[:digit:]\.]*')#1ER MODIF#

    #info nom de machine
    echo " le nom de la machine est :" $(hostname) #2EME MODIF#

    #info RAM
    echo "RAM :" $(free -h)

    #x32/64 BITS
    echo " cette version est :" $(arch) "BITS"

    #nb de COEUR + model
    echo "la machine a " $(cat /proc/cpuinfo | grep processor | wc -l) "coeur(s)"
    echo "le model " $(cat /proc/cpuinfo | grep ' model name')

    0
    1. c199 Messages postés 28 Statut Membre
       
      PS: petite modif



      #!/bin/bash
      #info report sur ordi
      #création fichier log

      #connaitre @ip pour subnet
      read -p 'quel @ip interroger ?' ip



      #vérification des login et mot de passe
      echo "le login est : $ip"#sa sera @ip quon as mit au prompt#


      #connexion ssh
      echo $(ssh -a -4 root@$ip)
      #POUR LE MOT DE PASSE J'ARRIVE pas A TROUVER UN MOYEN de le rentrer automatiquement mais c'est pas grave#
      #je rentre le mot de passe manuellement mais il veut pas continuer plus #
      #et plus aucune touche ne fonctionne après ça je suis obliger de fermer le terminal #

      #info sur @ip
      echo " @ip est " $(ip a | grep -o 'inet.*brd [[:digit:]\.]*')#1ER MODIF#

      #info nom de machine
      echo " le nom de la machine est :" $(hostname) #2EME MODIF#

      #info RAM
      echo "RAM :" $(free -h)

      #x32/64 BITS
      echo " cette version est :" $(arch) "BITS"

      #nb de COEUR + model
      echo "la machine a " $(cat /proc/cpuinfo | grep processor | wc -l) "coeur(s)"
      echo "le model " $(cat /proc/cpuinfo | grep ' model name')
      0
      1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > c199 Messages postés 28 Statut Membre
         
        Pour ssh sans mot de passe, il te faut créer des clés : Comment se connecter en SSH sans mot de passe ?

        Quand au reste du script, pour qu'il s'exécute sur la machine distante, il faut soit appeler un autre script où tu auras mis les commandes à exécuter (
        ssh login@Machine 'bash -s' < local_script.sh
        ), soit formater ta commande ssh pour qu'elle exécute un here document.
        0
  12. c199 Messages postés 28 Statut Membre
     
    desole zipe31 je comprend rien peut tu me le reexpliquer plus clariement STP _/\_
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Pour te connecter en SSH sans mot de passe il te faut générer des clés d'authentification (voir et lire mon lien ci-dessus) !

      Pour exécuter des commandes contenues dans un script (par exemple nommé
      local_script.sh
      ) via ssh il te faut appeler le script contenant les commandes de cette façon :
      ssh login@Machine 'bash -s' < local_script.sh


      Ou alors dans le même script en utilisant la syntaxe :
      ssh login@Machine << 'ENDSSH'
      tes commandes


      etc.
      ENDSSH
      0
      1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Une idée de ce que ça peut donner (ici c'est la 2nd option qui est en action…) :

        0
      2. c199 Messages postés 28 Statut Membre > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
         
        le 'ENDSSH' c'est une commande ou je dois le remplacer par autre chose
        0
      3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > c199 Messages postés 28 Statut Membre
         
        C'est la façon de signifier que le
        here document
        est fini.

        Il faut que ce soit le même que celui mis après les 2 chevrons qui commencent le
        here document
        .

        Après c'est au choix :
        commande << 'EOF'


        EOF


        commande << 'FIN'


        FIN
        0
  13. c199 Messages postés 28 Statut Membre
     
    j'y arrive pas et j'arrive toujours pas a comprendre comment ca doit fonctionner
    mon code


    read -p 'quel @ip interroger ?' ip
    echo $(ssh root@$ip <<-FIN)
    commande 1
    commande 2
    commande 3
    commande 4
    FIN # ou $(FIN)#


    ce que sa me retourne :

    quel @ip interroger : 192.168.10.25
    ./info.sh :ligne 10 avertissement "here document" a la ligne 10 delimite par la fin du fihier (au lieu de "FIN")
    ./info.sh:ligne 9 avertissement "here document" a la ligne 9 delimite par la fin du fihier (au lieu de "FIN")
    Pseudo-Terminal will nit be allocated because stdin is nit a terminal
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Dans mes exemples, j'ai mis un "-" (tiret) avant le mot-clé FIN ? Non ! Donc…
      Le tiret sert pour tout autre chose.

      Dans mon exemple il y a des quotes simples autour du mot 'FIN' ce n'est pas pour faire joli ;-\

      Quant à l'erreur
      Pseudo-Terminal will nit be allocated because stdin is nit a terminal
      il faut rajouter l'option "-T" dans ta commande ssh :
      ssh -T login@IP
      0
  14. c199 Messages postés 28 Statut Membre
     
    je ne comprend rien a cette histoire de
    here document

    est ce que quand tu met du code a reecrire tu peux le mettre en sorte que quand je le copie il marche ? car quand je recopie mot pour mot ils me mettent que je dois mettre des
     $ 
    et autre chose qui manque (je suis sur du linux /ubuntu )

    VOICI MON CODE :
    #!/bin/bash
    read -p 'quel @ip interroger ?' ip
    #VERIFICATION DE @IP
    echo "vous avez choisi $ip"  #a-t-on vrm besoin de mettre echo a chaque fois #
    echo 
    echo $(ping -c4 $ip)
    sleep 5
    
    #CONNEXION SSH
    $(ssh -T root@$ip <<'FIN')
    echo "-------------------"
    echo "le nom de la machine est :" $(hostname)
    echo "la machine a " $(cat /proc/meminfo | grep processor | wc -l) "coeur(s)"
    'FIN'
    
    


    pour le 'FIN' j'ai tout essaye
    apres il me mettent des erreur commes :

    apres avoir pinger ca me met
    ./info.sh: ligne 17: avertissement : a la ligne 17 delimite par la fin du fichier ( au lieu de FIN)
    ./info.sh: ligne 16: avertissement : a la ligne 16 delimite par la fin du fichier ( au lieu de FIN)

    apres il me demande le mot de passe (je rentre le bon et il marche)
    connection closed by 192.168.10.32 port 22
    ca contine mon script enme donnant les info mais de mon ordi
    ./info.sh: ligne 31 : FIN : commande intoruvable
    ou des fois quand je met une @ip hors du site ou je suis jai les erreurs suivantes :
    the authencity of host cant be etablished
    ECDSA key fingerprint is (trop long pour le reecrire)
    root@192.168.1.38 's password :
    mesg: ttyname failed : Ioctl inaproprie pour un peripherique
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      #CONNEXION SSH
      $(ssh -T root@$ip <<'FIN')
      Il ne faut pas mettre la commande entre "
      $(…)
      " !

      #CONNEXION SSH 
      ssh -T root@$ip <<'FIN'
      echo "-------------------"
      echo "le nom de la machine est :" $(hostname)
      echo "la machine a " $(cat /proc/meminfo | grep processor | wc -l) "coeur(s)"
      'FIN'
      0
  15. c199 Messages postés 28 Statut Membre
     
    je viens d'essayer merci mais jai encore quelque erreurs comme:
    apres le ping de @ip
    ligne 41 avertissement here document a la ligne 16 delimite par la fin du fichier (au lieu de "fin")
    puis apres avoir entre le bon MDP
    Welcome to ubuntu 16.04.0.2 lts (GNU /linux 4.4 ...)
    • documentation https ...


    mesg: ttyname failed inaproprie pour un generique

    mes commande ont marhce et apres le
    ---------------------------------
    -bash: ligne 15: FIN :commande introuvable
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Merci d'afficher la sortie de ton script via cette commande :
      cat -An ton-script
      0
  16. c199 Messages postés 28 Statut Membre
     
    merci pour ton aide
    en faite on s'est rendu compte qu'on pouvait pas faire du SSH
    du coup on leur envoie par mail et il va nous le renvoyer par mail
    Maintenant je cherche un autre moyen d’ouvrir le script comme un programme et non comme un fichier test

    t'aurai une solution
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      J'aurais un semblant de solution si et seulement si j'avais compris ta demande, ce qui n'est pas le cas ;-\
      ouvrir le script comme un programme
      Qu'entends-tu par là ?
      0