Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/01/2018, à 21:16

mr_apero

[recherche] script de comptage des fichiers avec envoi par mail

Bonjour,

pour notre asso, je voudrais mettre en place un serveur de fichiers (samba) dans une VM. Chaque membre à son propre espace.
Donc pour éviter d’ajuster chaque matin la vm. Je voudrais avoir un script qui me permet de savoir, combien il y a de fichiers dans des dossier et leur taille.
Histoire d'anticiper...

Ensuite j'aimerais le script m'envoi un mail avec tous les résultats.

Du genre...

Mail de : serveurfichier@xyz.org
Objet: Info serveur

Sujet:
User1
/home/user1/Documents: 13678 fichiers Taille total: 12GO
/home/user1/Images: 21 fichiers Taille total: 35MO
...
==================================================
User2
/home/user1/Documents: 6745328 fichiers Taille total: 198GO
/home/user1/Images: 9876 fichiers Taille total: 98GO
...
==================================================
ESPACE TOTAL: 4 TO
ESPACE LIBRE: 3 TO
==================================================


Comme je débute encore avec linuxmint, j'aurais besoin un sacre coup de main. Avez vous la gentillesse de m'aider?
En tous cas, deja un grand merci d'avance pour votre lecture et peut etre pour votre aide

Cordialement

mr_apero wink

Dernière modification par mr_apero (Le 27/01/2018, à 20:35)

Hors ligne

#2 Le 26/01/2018, à 22:37

DonutMan75

Re : [recherche] script de comptage des fichiers avec envoi par mail

Hello,
quelques retours rapides :

1) Gestion des quotas : https://doc.ubuntu-fr.org/quota
A vérifier si ça marche avec samba, j'ai un gros doute quand même

2) Exécution régulière d'une tâche : https://doc.ubuntu-fr.org/cron

3) Connaître la taille d'un répertoire :

$ du -sh /chemin/de/mon/repertoire

4) Un premier (petit) pas de script

#! /bin/sh
Folder="/chemin/vers/mon/repertoire"
Size=$(du -sh "$Folder")

echo "$Folder : taille totale $Size" | mail toto@titi.fr -s "Info serveur"

Il reste lister le nombre de fichier d'un répertoire, la déclaration de tableau de chemins + la boucle for qui va bien...
Pour l'espace total/disponible, un df ferait bien l'affaire je pense.

$ man df

Bon courage pour la suite smile
Bonne soirée à tous,

EDIT : erreur de typo en (3), il s'agit bien de du et non pas de ds !

Donut

Dernière modification par DonutMan75 (Le 28/01/2018, à 01:00)

Hors ligne

#3 Le 27/01/2018, à 18:41

mr_apero

Re : [recherche] script de comptage des fichiers avec envoi par mail

un super grand merci pour ton aide
j'ai commencer à me lancer, sans connaissance, donc soyez indulgent.
c'est ne que un essai, enfin un debut, histoire de demander 2-3 trucs
Si vous avez le courage de me corriger mon code je serait ravi

#!/bin/bash 
#================Variables===============================
users= apero lagavulin diplomatico belvedere erdinger
user= $user1 $user2 $user3 $user4 $user5 

user1=apero
user2=lagavulin
user3=diplomatico
user4=belvedere
user5=erdinger

nom=Robot-serveur@apero.cc
dest=apero@sur365jours.fr
videos="/home/$user/videos"
photos="/home/$user/photos"
musique="/home/$user/musique"
documents="/home/$user/documents"
log= /tmp/log
date= date -d 'now'
Size=$(ds -sh "$Folder")
espacedisque= df -h


#===============MAIL===============================

echo "Subject: Subjecy" > $log
echo "FROM: $nom" >> $log
echo "To: $dest" >> $log
echo "Content-Type: text/html; charset=us-ascii" >> $log
echo >> $log
echo "<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">" >> $log
echo "<html>" >> $log
echo "<pre>" >> $log
echo "<font size=3 color=blue><b>Message Body</b></font>" >> $log

#==================Fichier info=======================================
echo "#Fichier Info serveur" | > $log
echo "#______________________________________________________" | >> $log
echo "##### Espace disque du $user1 ######" | > $log
echo "$videos : taille totale $Size" | > $log
echo "$photos : taille totale $Size" | > $log
echo "$musique : taille totale $Size" | > $log
echo "$documents : taille totale $Size" | > $log
echo "#______________________________________________________" | >> $log
echo "##### Espace disque du $user2 ######" | >> $log
echo "$videos : taille totale $Size" | >> $log
echo "$photos : taille totale $Size" | >> $log
echo "$musique : taille totale $Size" | >> $log
echo "$documents : taille totale $Size" | >> $log
echo "#______________________________________________________"| >> $log
echo "############## ESPACE DISQUE ##########################"| >> $log
echo " $espacedisque
/usr/lib/sendmail "$dest" < $log

Voila maintenant mes questions wink

1) Comment utiliser plusieurs variables dans une seul ligne?
      videos="/home/$user/videos"  pour remplacer $user en fonction des utilisateurs (users= apero lagavulin diplomatico belvedere erdinger)
2) Comment écrire des lignes en fonction de l'utilisateur?

echo "#______________________________________________________" | >> $log
echo "##### Espace disque du $user2 ######" | >> $log
echo "$videos : taille totale $Size" | >> $log
echo "$photos : taille totale $Size" | >> $log
echo "$musique : taille totale $Size" | >> $log
echo "$documents : taille totale $Size" | >> $log

Voila pour le moment wink

Hors ligne

#4 Le 28/01/2018, à 00:59

DonutMan75

Re : [recherche] script de comptage des fichiers avec envoi par mail

Hello,
ton code n'est pas super lisible pour le moment. Notamment j'ai l'impression que tu as des variables qui sont utilisées AVANT d'être déclarées/initialisées. Par ailleurs, c'est toujours bien de protéger ses variables par des " "

dest="apero@sur365jours.fr"

au lieu de :

dest=apero@sur365jours.fr

Attention aussi à ne pas mettre d'espace autour du signe = au moment de l'initialisation :

log= /tmp/log

est incorrect

log=/tmp/log

est mieux

log="/tmp/log"

est parfait smile

Enfin c'est ">> ./fichier.log" pour la redirection vers un fichier de log et non pas "| >> ./fichier.log"

Je ne suis pas super calé en tableau bash mais voici une suggestion qui passe par un fichier externe.

A supposer que :

  1. tu aies un fichier users.dat qui contiennent la liste de tes users

  2. chaque user à les 4 répertoires videos, photos, musique et document dans son $HOME

Alors dans ce cas :

$ cat users.dat
apero
lagavulin
diplomatico
belvedere
erdinger

On pourrait imaginer quelque chose dans le genre du code ci-dessous (pas testé). A noter l'utilisation d'une fonction traiter_dir qui renvoie la taille du répertoire fourni en argument. Je ne traite en revanche pas la partie du mail. A noter dans cette fonction, l'appel à awk pour ne garder que la première colonne du résultat de du (ie la taille).

#! /bin/sh

traiter_dir(){
Folder="$1"
Size=$(du -sh "$Folder" | awk '{print $1}')
echo "$Folder : taille totale $Size"
}

dest="apero@sur365jours.fr"
log="/tmp/log"
userlist="./users.dat"

while read user ; do
    echo "#______________________________________________________"  >> "$log"
    echo "##### Espace disque de $user ######" >> "$log"
    traiter_dir "/home/${user}/videos" >> "$log"
    traiter_dir "/home/${user}/photos" >> "$log"
    traiter_dir "/home/${user}/musique" >> "$log"
    traiter_dir "/home/${user}/documents" >> "$log"
done < "$userlist"

Bon courage pour la suite smile

Donut

Dernière modification par DonutMan75 (Le 28/01/2018, à 01:02)

Hors ligne

#5 Le 28/01/2018, à 11:54

mr_apero

Re : [recherche] script de comptage des fichiers avec envoi par mail

Super !!! J'avance et en plus tu m'explique bien. Merci big_smile

Donc pour le moment mon script se lance bien sans erreur, sauf il n’écris pas tout dans mon fichier log. Que le dernier utilisateur de la liste ici erdinger et mon message
html du mail. C'est quoi mon erreur stp ?

cat > users.dat << EOF 
apero
lagavulin
diplomatico
belvedere
erdinger
EOF
nom="Robot-serveur@apero.cc"
dest="apero@sur365jours.fr"
videos="/home/$user/videos"
photos="/home/$user/photos"
musique="/home/$user/musique"
documents="/home/$user/documents"
log="/tmp/serveur.log"
da="date -d 'now'"
touch $log
traiter_dir(){
Folder="$1"
Size=$(du -sh "$Folder" | awk '{print $1}')
echo "$Folder : taille totale $Size"
}
log="/tmp/log"
userlist="./users.dat"
while read user ; do
    echo "#______________________________________________________"  >> "$log"
    echo "##### Espace disque de $user ######" >> "$log"
    traiter_dir "/home/${user}/Vidéos" >> "$log"
    traiter_dir "/home/${user}/Images" >> "$log"
    traiter_dir "/home/${user}/Musique" >> "$log"
    traiter_dir "/home/${user}/Documents" >> "$log"
done < "$userlist"
#===============MAIL===============================
echo "Subject: Subjecy" > $log
echo "FROM: $nom" >> $log
echo "To: $dest" >> $log
echo "Content-Type: text/html; charset=us-ascii" >> $log
echo >> $log
echo "<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">" >> $log
echo "<html>" >> $log
echo "<pre>" >> $log
echo "<font size=3 color=blue><b>messages issu du fichier log</b></font>" >> $log

Hors ligne

#6 Le 28/01/2018, à 12:28

moko138

Re : [recherche] script de comptage des fichiers avec envoi par mail

Je dis peut-être une bêtise car je sors de mes spécialités, mais ne faudrait-il pas remplacer

done < "$userlist"

par

done << "$userlist"

?


%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel :  À la découverte de dcraw

Hors ligne

#7 Le 28/01/2018, à 12:37

Watael

Re : [recherche] script de comptage des fichiers avec envoi par mail

oui, c'est "une bêtise".

echo "Subject: Subjecy" > $log

à ce moment là, tout ce qu'a écrit la boucle dans le log est écrasé.

Dernière modification par Watael (Le 28/01/2018, à 12:38)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 28/01/2018, à 13:54

DonutMan75

Re : [recherche] script de comptage des fichiers avec envoi par mail

+1 pour la remarque de Watael
par ailleurs ton script est bizarrement construit non ?
Tu commences par écrire le message de ton mail dans $log PUIS tu écris l'entête ???
J'aurais fait ça en sens inverse...

Donut

Hors ligne

#9 Le 28/01/2018, à 14:44

mr_apero

Re : [recherche] script de comptage des fichiers avec envoi par mail

Ok, j'ai mis dans l'autre sens, sauf maintenant j'ai bien tous mes utilisateurs du fichier et le comptage de taille.
Mais j'ais plus la parti mail. Que je voulais utiliser avec le commande sendmail à la fin. Mais j'ai maitrise pas encore la commande, comme tous le reste wink

Donc mes questions:
Pourquoi je ne vois pas les info du mail?
Quelle est la commande pour sendmail qui m'ajoute dans l'objet du message le contenu du fichier log et ajoute en même temps en pièce jointe?

cat > users.dat << EOF 
apero
lagavulin
diplomatico
belvedere
erdinger
EOF
nom="Robot-serveur@apero.cc"
dest="apero@sur365jours.fr"
sujet="Info serveur Asso du $da
videos="/home/$user/videos"
photos="/home/$user/photos"
musique="/home/$user/musique"
documents="/home/$user/documents"
log="/tmp/serveur.log"
da="date -d 'now'"
touch $log
#===============MAIL===============================
echo "Subject: message test" >> $log
echo "FROM: $nom" >> $log
echo "To: $dest" >> $log
echo "Content-Type: text/html; charset=us-ascii" >> $log
echo >> $log
echo "<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">" >> $log
echo "<html>" >> $log
echo "<pre>" >> $log
echo "<font size=3 color=blue><b> texte du fichier log </b></font>">> $log

traiter_dir(){
Folder="$1"
Size=$(du -sh "$Folder" | awk '{print $1}')
echo "$Folder : taille totale $Size"
}
log="/tmp/log"
userlist="./users.dat"
while read user ; do
    echo "#______________________________________________________"  >> "$log"
    echo "##### Espace disque de $user ######" >> "$log"
    traiter_dir "/home/${user}/Vidéos" >> "$log"
    traiter_dir "/home/${user}/Images" >> "$log"
    traiter_dir "/home/${user}/Musique" >> "$log"
    traiter_dir "/home/${user}/Documents" >> "$log"
done < "$userlist"

sendmail -s "$sujet" -a "From:$nom" ###<--- a compléter avec le contenu de fichier log

Modération : merci d'utiliser les balises code (explications ici).

Dernière modification par cqfd93 (Le 28/01/2018, à 14:45)

Hors ligne

#10 Le 28/01/2018, à 15:21

Watael

Re : [recherche] script de comptage des fichiers avec envoi par mail

parce que log est défini après la redirection des headers.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#11 Le 28/01/2018, à 21:15

DonutMan75

Re : [recherche] script de comptage des fichiers avec envoi par mail

videos="/home/$user/videos"
photos="/home/$user/photos"
musique="/home/$user/musique"
documents="/home/$user/documents"

>> c'est sensé servir à quoi ces lignes au début de ton code ? Que vaut $user à ce stade du script ?

ta variable log est déclarée à deux endroits différents. Quel doit être la bonne valeur et à quel moment est-il opportun de le déclarer ?

Peux-tu donner un retour sur l’exécution de ton script ? Sur le contenu de ton fichier de log après exécution ?

Pour tester l'envoi de mail, le mieux serait sans doute que tu fasses un cas très simple (ex: tu t'envoies un mail minimaliste avec un sujet et trois lignes de texte). Si ça ne marche pas, repère l'erreur documentes-toi et, si tu n'arrives pas à résoudre le pb, ouvre un sujet ici...
Là je ne comprends pas ce qui bloquant... y'a une erreur qui est générée ?

Bonne soirée à tous,

Donut

Hors ligne

#12 Le 28/01/2018, à 21:39

mr_apero

Re : [recherche] script de comptage des fichiers avec envoi par mail

Bonsoir tlm,

finalement j'ai réussi de lancer mon premier tout petit code...Plus rien bloque...champagne...beurk...un diplomatico wink
Le script c'est lancer sans erreurs, qui veut dire il ma bien creer un fichier serveur.log avec tous les infos.

Le script:

cat > users.dat << EOF 
diplomatico
lagavulin
belvedere
erdinger
EOF
nom="Robot-serveur@apero.cc"
dest="apero@sur365jours.fr"
log="/tmp/serveur.log"
da="date -d 'now'"
touch $log
#===============MAIL===============================
echo "Subject: message test" >> $log
echo "FROM: $nom" >> $log
echo "To: $dest" >> $log
echo "Content-Type: text/html; charset=us-ascii" >> $log
echo >> $log
echo "<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">" >> $log
echo "<html>" >> $log
echo "<pre>" >> $log
echo "<font size=3 color=blue><b> texte du fichier log </b></font>">> $log
traiter_dir(){
Folder="$1"
Size=$(du -sh "$Folder" | awk '{print $1}')
echo "$Folder : taille totale $Size"
}
userlist="./users.dat"
while read user ; do
    echo "#______________________________________________________"  >> "$log"
    echo "##### Espace disque de $user ######" >> "$log"
    traiter_dir "/home/${user}/Vidéos" >> "$log"
    traiter_dir "/home/${user}/Images" >> "$log"
    traiter_dir "/home/${user}/Musique" >> "$log"
    traiter_dir "/home/${user}/Documents" >> "$log"
done < "$userlist"

#    echo "#______________________________________________________"  >> $log
#    echo "##### Utilisation totale" >> $log
#userT=$(df -h)
#echo $userT >> $log

Le fichier log

Subject: message test
FROM: Robot-serveur@apero.cc
To: apero@sur365jours.fr
Content-Type: text/html; charset=us-ascii

<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<pre>
<font size=3 color=blue><b> texte du fichier log </b></font>
#______________________________________________________
##### Espace disque de lagavulin ######
/home/lagavulin/Vidéos : taille totale 4,0K
/home/lagavulin/Images : taille totale 4,0K
/home/lagavulin/Musique : taille totale 4,0K
/home/lagavulin/Documents : taille totale 4,0K
#______________________________________________________
##### Espace disque de diplomatico ######
/home/diplomatico/Vidéos : taille totale 4,0K
/home/diplomatico/Images : taille totale 4,7M
/home/diplomatico/Musique : taille totale 4,0K
/home/diplomatico/Documents : taille totale 4,0M
#______________________________________________________
##### Espace disque de belvedere ######
/home/belvedere/Vidéos : taille totale 12G
/home/belvedere/Images : taille totale 501M
/home/belvedere/Musique : taille totale 4,3G
/home/belvedere/Documents : taille totale 7,5G
#______________________________________________________
##### Espace disque de erdinger ######
/home/erdinger/Vidéos : taille totale 4,0K
/home/erdinger/Images : taille totale 4,0K
/home/erdinger/Musique : taille totale 4,0K
/home/erdinger/Documents : taille totale 4,0K
videos="/home/$user/videos"
photos="/home/$user/photos"
musique="/home/$user/musique"
documents="/home/$user/documents"

Que vaut se ligne ? Bah rien... je les laisser,car je ne savais pas exactement comment tout fonctionne roll

Par contre pou l'envoi du mail, une nouvelle aventure commence. J'aimerais vraiment le contenu du fichier serveur.log soit dans l'objet du message avec une mise en forme correcte. Mais au pire de cas un message avec le fichier serveur.log en pièce jointe. Tu crois c'est dur à mettre en place? Ta  des pistes?

Hors ligne

#13 Le 28/01/2018, à 22:46

Watael

Re : [recherche] script de comptage des fichiers avec envoi par mail

c'est un peu bizarre, quand même, de créer un fichier avec un here-doc pour des données qui pourraient figurer dans une variable/tableau, ou simplement être les arguments (en dur) d'une boucle for, mais de faire tout un tas d'echo pour des lignes qui doivent aller dans un fichier. là, le here-doc aurait du sens.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne