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

Résolu
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

Résumé de la discussion

Une demande porte sur la création d’un script Bash pour récupérer les informations d’un PC: configuration, nombre de cœurs, adresse IP, RAM, nom d’ordinateur et modèle CPU, puis stocker ces données dans un log. Des contributions suggèrent d’utiliser ip a pour l’IP et hostname pour le nom d’ordinateur, ainsi que /proc/cpuinfo pour les cœurs, tout en privilégiant ip et SSH sans mot de passe. D’autres échanges évoquent des moyens d’exécuter des commandes à distance, notamment via SSH avec un script local ou un here document, et prévoient que le déploiement nécessite une gestion sécurisée des accès et des logs.

Bobot (l’IA à votre service)
  1. ok dacc
    alors on peut me donner des axes de recherches
    svp
    merci d'avance
    0
    1. Contributeur
      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
  2. 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. Contributeur
      Merci.

      Et donc ??? Qu'est-ce que tu as pondu qui correspond à ta demande ?
      0
  3. 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. Contributeur
      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
  4. jai aussi trouve une fonction "dmidecode" je voulais savoir est ce que c'etait bien et comment je pouvais l'utiliser ?
    0
    1. Contributeur
      Dans un terminal tape
      man dmidecode
      tu auras toutes les options possibles pour l'utiliser.
      0
  5. Modérateur
    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
    1. merci je vous montrerai mon scrypt quand jaurai plus avance sur mes recherche
      0
      1. Modérateur
        Oui alors sinon ça s'écrit "script" :-)
        Merci de soigner l'orthographe (pluriels, ponctuation, etc), on n'est pas sur facebook :-)
        0
    2. 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. Contributeur
        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
    3. 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. Contributeur
        Je ne t'ai donné qu'un exemple, sans connaître tes besoins réels. C'est à toi d'adapter !
        0
    4. 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. 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
      2. Contributeur
        @c199Pour 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
    5. desole zipe31 je comprend rien peut tu me le reexpliquer plus clariement STP _/\_
      0
      1. Contributeur
        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
      2. Contributeur
        @zipe31Une idée de ce que ça peut donner (ici c'est la 2nd option qui est en action…) :

        0
      3. @zipe31le 'ENDSSH' c'est une commande ou je dois le remplacer par autre chose
        0
      4. Contributeur
        @c199C'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
    6. 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. Contributeur
        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
    7. 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. Contributeur
        #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
    8. 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. Contributeur
        Merci d'afficher la sortie de ton script via cette commande :
        cat -An ton-script
        0
    9. 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. Contributeur
        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