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

Signaler
Messages postés
21
Date d'inscription
lundi 6 janvier 2020
Statut
Membre
Dernière intervention
21 janvier 2020
-
zipe31
Messages postés
38036
Date d'inscription
dimanche 7 novembre 2010
Statut
Non membre
Dernière intervention
21 janvier 2020
-
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

12 réponses

Messages postés
38036
Date d'inscription
dimanche 7 novembre 2010
Statut
Non membre
Dernière intervention
21 janvier 2020
4502
Salut,

À lire… merci ;-))
Messages postés
21
Date d'inscription
lundi 6 janvier 2020
Statut
Membre
Dernière intervention
21 janvier 2020

ok dacc
alors on peut me donner des axes de recherches
svp
merci d'avance
zipe31
Messages postés
38036
Date d'inscription
dimanche 7 novembre 2010
Statut
Non membre
Dernière intervention
21 janvier 2020
4502
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…
Messages postés
21
Date d'inscription
lundi 6 janvier 2020
Statut
Membre
Dernière intervention
21 janvier 2020

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`

zipe31
Messages postés
38036
Date d'inscription
dimanche 7 novembre 2010
Statut
Non membre
Dernière intervention
21 janvier 2020
4502
Merci.

Et donc ??? Qu'est-ce que tu as pondu qui correspond à ta demande ?
Messages postés
21
Date d'inscription
lundi 6 janvier 2020
Statut
Membre
Dernière intervention
21 janvier 2020

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 ?
zipe31
Messages postés
38036
Date d'inscription
dimanche 7 novembre 2010
Statut
Non membre
Dernière intervention
21 janvier 2020
4502
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.
Messages postés
21
Date d'inscription
lundi 6 janvier 2020
Statut
Membre
Dernière intervention
21 janvier 2020

jai aussi trouve une fonction "dmidecode" je voulais savoir est ce que c'etait bien et comment je pouvais l'utiliser ?
zipe31
Messages postés
38036
Date d'inscription
dimanche 7 novembre 2010
Statut
Non membre
Dernière intervention
21 janvier 2020
4502
Dans un terminal tape
man dmidecode
tu auras toutes les options possibles pour l'utiliser.
Messages postés
29130
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
18 janvier 2020
6744
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
Messages postés
21
Date d'inscription
lundi 6 janvier 2020
Statut
Membre
Dernière intervention
21 janvier 2020

merci je vous montrerai mon scrypt quand jaurai plus avance sur mes recherche
mamiemando
Messages postés
29130
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
18 janvier 2020
6744
Oui alors sinon ça s'écrit "script" :-)
Merci de soigner l'orthographe (pluriels, ponctuation, etc), on n'est pas sur facebook :-)
Messages postés
21
Date d'inscription
lundi 6 janvier 2020
Statut
Membre
Dernière intervention
21 janvier 2020

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 ?
zipe31
Messages postés
38036
Date d'inscription
dimanche 7 novembre 2010
Statut
Non membre
Dernière intervention
21 janvier 2020
4502
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.
Messages postés
21
Date d'inscription
lundi 6 janvier 2020
Statut
Membre
Dernière intervention
21 janvier 2020

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
zipe31
Messages postés
38036
Date d'inscription
dimanche 7 novembre 2010
Statut
Non membre
Dernière intervention
21 janvier 2020
4502
Je ne t'ai donné qu'un exemple, sans connaître tes besoins réels. C'est à toi d'adapter !
Messages postés
21
Date d'inscription
lundi 6 janvier 2020
Statut
Membre
Dernière intervention
21 janvier 2020

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')


c199
Messages postés
21
Date d'inscription
lundi 6 janvier 2020
Statut
Membre
Dernière intervention
21 janvier 2020

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')
zipe31
Messages postés
38036
Date d'inscription
dimanche 7 novembre 2010
Statut
Non membre
Dernière intervention
21 janvier 2020
4502 > c199
Messages postés
21
Date d'inscription
lundi 6 janvier 2020
Statut
Membre
Dernière intervention
21 janvier 2020

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.
Messages postés
21
Date d'inscription
lundi 6 janvier 2020
Statut
Membre
Dernière intervention
21 janvier 2020

desole zipe31 je comprend rien peut tu me le reexpliquer plus clariement STP _/\_
zipe31
Messages postés
38036
Date d'inscription
dimanche 7 novembre 2010
Statut
Non membre
Dernière intervention
21 janvier 2020
4502
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
zipe31
Messages postés
38036
Date d'inscription
dimanche 7 novembre 2010
Statut
Non membre
Dernière intervention
21 janvier 2020
4502 > zipe31
Messages postés
38036
Date d'inscription
dimanche 7 novembre 2010
Statut
Non membre
Dernière intervention
21 janvier 2020

Une idée de ce que ça peut donner (ici c'est la 2nd option qui est en action…) :

c199
Messages postés
21
Date d'inscription
lundi 6 janvier 2020
Statut
Membre
Dernière intervention
21 janvier 2020
> zipe31
Messages postés
38036
Date d'inscription
dimanche 7 novembre 2010
Statut
Non membre
Dernière intervention
21 janvier 2020

le 'ENDSSH' c'est une commande ou je dois le remplacer par autre chose
zipe31
Messages postés
38036
Date d'inscription
dimanche 7 novembre 2010
Statut
Non membre
Dernière intervention
21 janvier 2020
4502 > c199
Messages postés
21
Date d'inscription
lundi 6 janvier 2020
Statut
Membre
Dernière intervention
21 janvier 2020

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
Messages postés
21
Date d'inscription
lundi 6 janvier 2020
Statut
Membre
Dernière intervention
21 janvier 2020

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
zipe31
Messages postés
38036
Date d'inscription
dimanche 7 novembre 2010
Statut
Non membre
Dernière intervention
21 janvier 2020
4502
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