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 :

Vos scripts shell


Sujet :

Shell et commandes GNU

  1. #1
    Community Manager

    Profil pro
    Inscrit en
    Avril 2014
    Messages
    4 207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2014
    Messages : 4 207
    Points : 13 063
    Points
    13 063
    Par défaut Vos scripts shell
    Bonjour,

    J'ai décidé d'ouvrir ce thread qui va vous permettre de poster tous les scripts shell que vous avez personnellement développé.

    Tous les scripts sont la bienvenue. Veuillez s'il vous plait respecter la présention proposée ci-dessous.

    Nom du script: convertisseur

    Compatible avec: Bash

    Descriptif: permet de convertir des francs en euros et inversement.

    Pré-requis: le paquetage libmap, c'est juste pour l'exemple

    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Le code de mon programme
    ou

    Téléchargement: [Visualiser]

    Si votre script est trop long, veuillez insèrer un lien (voir ci-dessus) sinon, postez votre code avec bien entendu la balise code. Les postes qui ne respètent pas la présentation par défaut seront supprimés directement. Faites en sorte que votre code soit bien indenté, afin d'en faciliter sa lecture.

    Merci à tous

    PS: vous pouvez également proposer des améliorations aux scripts déjà présent dans ce thread.

  2. #2
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 598
    Points : 7 837
    Points
    7 837
    Par défaut
    Bonjour,

    Un script pour mettre en ligne simultanément plusieurs sites en parallèle (même site stocké à plusieurs endroit).

    Nom du script: ftpsite

    Compatible avec: bash

    Descriptif: téléchargement automatique, d'un fichier, d'une arborescence sur des sites ftp.

    Téléchargement: [Télécharger] : il contient plusieurs fichiers.

    PS: j'ai fait quelque chose d'équivalent pour faire les articles de devevoloppez.com et ensuite les mettre en ligne. Je peux les passer aux rédacteurs

  3. #3
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Nom du script: cyg-wrapper.sh

    Ecrit pour : bash, utilisable depuis n'importe quoi (bash, ksh, mutt, ...) qui tourne sous cygwin (la notion ne compatibilité n'a pas vraiment de sens, son shebang est explicite, et il ne peut être utilisé que sur une seule plateforme, cf les pré-requis)

    Descriptif: Permet de lancer des programmes natifs Windows depuis l'environnement cygwin, tout en leur passant des fichiers en paramètres.

    Les chemins façon POSIX sont transformés en chemins façon DOS/Windows. Les liens symbôliques sont suivis, il est possible de spécifier des paramètres d'option qui ne peuvent pas être des chemins à convertir, on peut demander à convertir ou neutraliser des variables d'environnement, ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # Pour plus d'informations:
    cyg-wrapper.sh --help | less
    Pré-requis: Cygwin, bash, cygUtils

    Téléchargement: [Visualiser] -- [Homepage]

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Points : 1 111
    Points
    1 111
    Par défaut
    Nom du script : convencodingfilename.sh
    Compatible avec : fonctionne avec Bash
    Descriptif : Convertit tous les noms de fichier du répertoire courant du format ISO8859-15 vers UTF8 standard. Pratique par exemple dans le cas d'une upgrade de sarge vers etch dont l'encodage standard est maintenant UTF8, ou même simplement pour des noms de fichiers Windows.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #!/bin/bash
     
    for i in ${1}/*; do
            orig=$i
            trad=$(echo ${i} | iconv -f ISO8859-15 -t UTF8 )
     
            if [ $trad != $orig ]; then
                    if [ ! -d $orig ]; then
                             mv $orig $trad
                    fi;
            fi;
    done;
    #Change l'encodage des nom de fichiers dont le format
    #n'est pas reconnu par votre Unix/Linux vers l'encodage de votre
    #système d'exploitation (ici de ISO8859-15 vers UTF8)
    #Le répertoire contenant les fichiers à modifier est le
    #premier et seul argument du script. Cela peut être modifié pour
    #passer les formats d'encodage en paramètres au script.
    #"man iconv" et "iconv --list" pour plus d'informations
    Pré-requis : iconv, mv

  5. #5
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut Afficher / masquer le bureau gnome
    Nom du script : showdesktop.sh
    Compatible avec : bash (pas testé : sh, csh, tcsh)
    Descriptif : Affiche ou masque le bureau gnome. A utiliser en ligne de commande ou avec un lanceur, particulièrement pour utilisation avec Avant Window Navigator.
    Pré-requis: wmctrl (exemples d'utilisation)
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
    if wmctrl -m | grep -q '"showing the desktop" mode: ON'; then
        wmctrl -k off
    else
        wmctrl -k on
    fi
    Téléchargement: [Visualiser]

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 403
    Points
    28 403
    Par défaut
    Nom du script : SaveFile.ksh
    Compatible avec : ksh
    Descriptif : Renomme un fichier source en sauvegardant les versions antérieures en ajoutant la date (et l'heure) au nom de fichier.
    Pré-requis: Aucun
    Remarque : Ce code est exécuté indifféremment sous AIX et Cygwin, d'où les " autour des noms de fichiers qui pourraient contenir des espaces.
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    #!/usr/bin/ksh
    #
    # SaveFile.ksh
    #
    # Renomme le fichier source en conservant les versions antérieures
    #
    # Options    :  Aucune  
    #
    # Paramètres :  $1  Nom du fichier Source
    #               $2  Nom du fichier Cible
    #
    # Affichage  :  Aucun
    #
    # Code retour : 0   Bonne exécution
    #               n   Erreur quelconque
    #
    # Dépendances : find
    #
    # Création  :   al1_24  10/10/2007
    #
    # Exemple : SaveFile.ksh tmp/tempo.txt rpt/report.txt
    #   si tmp/tempo.txt n'existe pas, aucune opération, retour 1
    #   si rpt/report.txt du 16/10/2007 existe déjà, il est renommé en rpt/report.20071016.txt
    #   si rpt/report.20071016.txt du 16/10/2007 à 10:54:35 existe déjà, il est renommé en rpt/report.20071016-105435.txt
    #   finalement, tmp/tempo.txt est renommé en rpt/report.txt
    #
    # set -x
    #-------------------------------------------------------------------#
    #   Fonctions utilitaires 
    #-------------------------------------------------------------------#
    function    GetFileDate
    #   Récupère la date (et l'heure) du fichier
    {   typeset _Prm="$1"   # Format de retour : D = date, T = Date et heure
        typeset _File="$2"  # Fichier testé
        # Le fichier existe et il y a un paramètre de format
        if [[ -e "${_File}" ]] && [[ -n "${_Prm}" ]]
        then
            typeset _Fmt='' # Format de retour
            case "${_Prm}" in
            D|d) _Fmt='%TY%Tm%Td\n' ;;  # YYYYMMDD  
            T|t) _Fmt='%TY%Tm%Td-%TH%TM%TS\n'   ;;  # YYYYMMDD-HHMMSS
            *)  return 1    ;;
            esac
            # Afficher la date ou l'heure de dernière modification
            find "$(dirname "${_File}")" -name "$(basename "${_File}")" -maxdepth 1 -printf ${_Fmt}
        else
            return 1
        fi
    } 
    #-------------------------------------------------------------------#
    #   Commande SaveFile
    #-------------------------------------------------------------------#
    typeset _SrcFile="$1"   # Nom de fichier source
    typeset _SaveFile="$2"  # Nom de fichier à créer
    # Si les paramètres sont renseignés et la source existe
    if [[ -n "${_SrcFile}" ]] && [[ -n "${_SaveFile}" ]] && [[ -e "${_SrcFile}" ]]
    then
        # Si les fichiers sont différents 
        if ! [[ "${_SrcFile}" -ef "${_SaveFile}" ]]
        then
            # Si la cible existe déjà
            if [[ -e "${_SaveFile}" ]] 
            then
                # Extraire les parties 
                typeset _FileExt="${_SaveFile##*.}"
                typeset _FileName="${_SaveFile%.*}"
                # Préparer les noms de fichier
                typeset _AddExt=$(GetFileDate d "${_SaveFile}")
                typeset _TempFile="${_FileName}.${_AddExt}.${_FileExt}"
                # Si une sauvegarde existe déjà
                if [[ -e "${_TempFile}" ]]
                then
                    # Renommer la sauvegarde existante
                    _AddExt=$(GetFileDate t "${_TempFile}")
                    mv "${_TempFile}" "${_FileName}.${_AddExt}.${_FileExt}" || return $?
                fi
                # Renommer le fichier à sauvegarder
                mv "${_SaveFile}" "${_TempFile}" || return $?
            fi
            # Enregistrer la nouvelle version
            mv "${_SrcFile}" "${_SaveFile}" || return $?
        else 
            return 0
        fi
    else
        return  1
    fi
    # EoF SaveFile.ksh
    Pour ceux qui recherchent une version complète de ksh93 pour Linux ou Cygwin, on peut la trouver en open source sur le site de AT&T.

  7. #7
    Membre confirmé
    Avatar de diden138
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    714
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 714
    Points : 589
    Points
    589
    Par défaut equivalent de la commande ps en shell
    Bonjour,
    enfin un endroit ou on peut déposer nos scripts
    Nom du script : Processlist.sh
    Compatible avec : sh
    Descriptif :Liste tous les processus (équivalent à un ps-e).
    Pré-requis: Aucun.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #!/bin/sh
    #script shell  qui liste tous les processus en exécution 
    if (("$#">"0"));then if test $1="-h";then echo "PID | CMD ";else cat plistehelp;fi;fi;
    cd ../../proc ;
    for i in $(ls); do if (("$i">"0"));then [[ -d $i ]] && echo -n "$i| ";if test -f $i/cmdline ;then cat $i/cmdline;fi ;echo ;fi;done;
    echo "script réalisé par cherif mohieddine belkacem";
    cd ../$HOME;
    et le petit help de la commande qui va avec
    Plistehelp.sh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    utilisation : sh pliste.sh [-h]
                  ./ pliste.sh [-h]
    affiche la liste des processus (PID | CMD)
        -h :  affiche l'entete du tableau PID | CMD
    sans option il n'affiche pas l'entete
    cordialement @+

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 403
    Points
    28 403
    Par défaut
    Nom du script: _GetIni

    Compatible avec: ksh

    Descriptif: Retourne la valeur d'une chaîne dans un fichier .ini au format CHAINE=VALEUR.
    Si la chaine n'existe pas, une valeur par défaut peut être précisée.

    Pré-requis: La chaine recherchée ne doit pas contenir le caractère =
    Il ne doit pas y avoir d'espace autour du caractère = dans la ligne du ficheir .ini

    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #----------------------------------------------------------
    # Fonction _GetIni : Cherche une chaîne dans un fichier .ini 
    #----------------------------------------------------------
    function _GetIni
    {    typeset    _IniFile="$1"    # Nom du fichier ini
        typeset    _IniStr="$2"    # Chaîne à rechercher
        typeset    _IniDef="$3"    # Valeur par défaut
        typeset    _IniRes=''        # Valeur retournée
        # Si le fichier existe et la chaîne est définie
        if [[ -s "${_IniFile}" ]] && [[ -n "${_IniStr}" ]]
        then
            # Extraire le contenu de la ligne de définition
            _IniRes=$(egrep "^${_IniStr}=" ${_IniFile} | cut -d'=' -f2-)
        fi
        # Prendre la valeur par défaut si non définie
        print "${_IniRes:-${_IniDef}}"
    }

  9. #9
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 356
    Points : 418
    Points
    418
    Billets dans le blog
    15
    Par défaut script de sauvegarde sur bande
    bonjour,

    Nom du script: sauve

    Compatible avec: sh

    Descriptif: ce script vous permettra d'appliquer une stratégie de sauvegarde journalière à trois niveaux sur un mois.
    supposons que vous voulez sauvegarder le répertoire /home. Prenons, par exemple, le lundi. Le premier lundi du mois, vous faites une sauvegarde totale:
    Les autres lundi, vous sauvegarder les fichiers qui ont été modifiés depuis le premier lundi du mois.
    le deuxième lundi du mois (s come semaine):
    le troisième:
    Ainsi de suite jusqu'au mois suivant.
    Les autres jours, vous sauvegarder tous les fichiers modifiés depuis le dernier lundi.
    Le mardi (j comme jours):
    le mercredi:
    Et ainsi de suite jusqu'à dimanche

    Pré-requis: tar, cpio, find, mt

    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    #!/bin/sh
     
    #    sauve, a backup script
    #    Copyright (C) 2007 2009 Mathieu SERPA
    #
    #    This program is free software: you can redistribute it and/or modify
    #    it under the terms of the GNU General Public License as published by
    #    the Free Software Foundation, either version 3 of the License, or
    #    (at your option) any later version.
     
    #    This program is distributed in the hope that it will be useful,
    #    but WITHOUT ANY WARRANTY; without even the implied warranty of
    #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #    GNU General Public License for more details.
     
    #    You should have received a copy of the GNU General Public License
    #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
     
    #    matser1973@free.fr
     
    list(){
    case "$1" in
    "-t")
       shift
       find "$@";;
    "-i")
       moment="$2"
       shift
       shift
       find "$@" -daystart -mtime "$moment";;
    *)
       echo usage:
       echo "sauve -t répertoire(s) | -j nb_jours répertoire(s) | -s nb_semaines répertoire(s)"
    esac
    }
     
    sauve_incr1(){
    if [ $1 -le 4 ]; then
       etendue=$(($1*7))
       shift
       (
          while [ $etendue -ge 0 ];do
             list -i $etendue $@
             etendue=$(($etendue-1))
          done
       )|cpio -ovBH crc>/dev/st0
    else
       echo le nombre de semaine ne doit pas être spérieur à 4
    fi
    }
     
    sauve_incr2(){
    if [ $1 -le 6 ]; then
       etendue=$1
       shift
       (
          while [ $etendue -ge 0 ];do
             list -i $etendue "$@"
             etendue=$(($etendue-1))
          done
       )|cpio -ovBH crc>/dev/st0
    else
       echo le nombre de jours ne doit pas être supérieu à 6
    fi
    }
    if [ $(whoami) = 'root' ]; then
       cd $HOME
       if [ -e sauve-etc.tar.bz2 ]; then
          rm sauve-etc.tar.bz2
       fi
       tar -jcvf sauve-etc.tar.bz2 /etc
       mt -f /dev/st0 retension
       case $1 in
       "-t")
          shift
          list -t "$@"|cpio -ovBH crc>/dev/st0;;
       "-s")
          etendue="$2"
          shift
          shift
          sauve_incr1 $etendue "$@";;
       "-j")
          etendue="$2"
          shift
          shift
          sauve_incr2 $etendue "$@";;
       *)
          echo usage:
          echo "sauve -t répertoire(s) | -j nb_jours répertoire(s) | -s nb_semaine répertoire(s)";;
       esac
       mt -f /dev/st0 rewind
       mt -f /dev/st0 eject
    else
       echo vous devez être root pour utiliser ce script
    fi

  10. #10
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Nom du script: HDFullnessCheck

    Compatible avec: Bash

    Descriptif:Vérification que les partitions ne s'engorgent pas et envoi de mail le cas échéant

    Pré-requis: adresse mail / adapter les variables

    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    #!/bin/bash
    # Auteur : Anonyme - cf http://www.debian-administration.org/articles/143 #
    # Licence : GPL                                                           #
    # Note : ce script fonctionne en bash pas en sh
     
    # CONSTANTES
    HOSTNAME=$(hostname)
    DOMAINE="@mondomaine.fr"
     
    myscriptname="HDFullnessCheck"
    pidfile="/var/run/$myscriptname.pid"
    logfile="/var/log/localscript/$myscriptname.log"
     
    # a adapter :
    mailing_list=administrateur$DOMAINE
     
    # pourcentage limite d'occupation du disque
    LIMIT=90
    mail_body_file=$(mktemp)
     
    log_failure()
    {
    	echo "`date` [echec]" >> $logfile
    }
    log_success()
    {
            echo "`date` [succes]" >> $logfile
    }
     
    # Ecriture du contenu du message dans un fichier temporaire
    write_mail_body()
    {
    cat << EOF >> $mail_body_file
    Bonjour.
     
    La partition $partition sur $HOSTNAME necessite votre intervention.
    Elle est remplie a $percent % : il reste $disp
     
    Cordialement.
    EOF
    }
     
    # Ecriture du contenu du message dans un fichier temporaire
    write_error_body()
    {
    cat << EOF >> $mail_body_file
    Bonjour.
     
    $pidfile existe. Cela indique que le script ne s'est pas termine correctement.
     
    Cordialement.
    EOF
    }
     
    # string vide
    if [ -z "$pidfile" ]
    then
    	mail_subject="[$HOSTNAME] Alerte : erreur $pidfile"
    	write_error_body
    	mail -s "$mail_subject" $mailing_list < $mail_body_file
    	log_failure
    	exit 1
    fi
    # fichier existe
    if [ -e "$pidfile" ]
    then
            mail_subject="[$HOSTNAME] Alerte : erreur $pidfile"
            write_error_body
            mail -s "$mail_subject" $mailing_list < $mail_body_file
    	log_failure
            exit 1
    fi
     
    echo $! > $pidfile
     
    # SCRIPT
    # on evite les disquettes, les partages nfs et tout ce qui ne commence pas par /
    for line in $( df -Ph -x nfs | grep "^/" | grep -v "^/dev/fd[0-9]" | sed -r "s/ {1,}/@/g" ); do
     
    	percent=$( echo "$line" | awk -F@ '{print$5}' | tr -d '%' )
    	partition=$( echo "$line" | awk -F@ '{print$6}')
    	disp=$( echo "$line" | awk -F@ '{print$4}')
     
    	if [ $percent -ge $LIMIT ]; then
    		mail_subject="[$HOSTNAME] Alerte : Partition $partition pleine a $percent%"
    		write_mail_body
    		mail -s "$mail_subject" $mailing_list < $mail_body_file
    	fi
    done
     
    rm -f $pidfile
    log_success
     
    exit 0

  11. #11
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Nom du script: wakewatcher

    Compatible avec: Bash

    Descriptif:Vérification qu'une machine est allumée et envoi de mail aux personnes concernées

    Pré-requis: adresse mail / adapter les variables

    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #!/bin/bash
     
    data_directory=/var/lib/wakewatcher
    computer=nomdelamachine
     
    mail_sent="$data_directory"/"$computer"
     
    mail_body_file=$(mktemp)
    mail_subject="[Message automatique] Alerte:$computer $(date) "
    mailing_list="administrateur@mondomaine.fr,utilisateur1@mondomaine.fr,utilisateur2@mondomaine.fr"
     
    ping_test=$( ping -c3 -f $computer | grep " 0% packet loss" ) 
     
    file_missing_error="Erreur : $mail_sent n'existe pas"
     
    (! test -f $mail_sent ) && echo $file_missing_error && exit
     
    # Ecriture du contenu du message dans un fichier temporaire
    write_mail_body()
    {
    cat << EOF >> $mail_body_file
    Bonjour.
     
    L'ordinateur $computer ne repond pas.
    Il se peut qu'il soit eteint.
    Il se peut egalement qu'il ne reponde pas a cause d'une defaillance du reseau.
     
    Cordialement.
    EOF
    }
     
    # si l'on ne recupere rien, c'est que le ping n'a pas eu lieu correctement, et donc que l'ordi est eteint
    if [ -z "$ping_test" ] ; then
    	# si l'on a deja envoye un mail, pas besoin d'en renvoyer un
    	if [ $(cat $mail_sent) = "1" ] ; then
    		exit
    	# sinon on l'envoie
    	else
    		write_mail_body
    		#sans oublier de signaler qu'on l'a envoye dans le fichier
    		( mail -s "$mail_subject" $mailing_list < $mail_body_file ) && echo 1 > $mail_sent
    	fi
    else
    	#Ecriture dans le fichier qu'on n'a pas envoye de mail, et pour cause, l'ordinateur repond
    	( test -d $src_directory ) && echo 0 > $mail_sent
    fi

  12. #12
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Nom du script: checkvir

    Compatible avec: Bash

    Descriptif:scan antivirus et envoi de mail de rapport

    Pré-requis: clamav / adresse mail

    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #!/bin/bash
    HOSTNAME=$(hostname)
    DOMAINE="@mondomaine.fr"
     
    myscriptname="checkvir"
    pidfile="/var/run/$myscriptname.pid"
    logfile="/var/log/localscript/$myscriptname.log"
     
    # mail
    mailing_list=administrateur$DOMAINE
    mail_body_file=$(mktemp)
     
    #
    ScannedDirectories="/home /chemin /encore/unchemin "
    Quarantine="/chemin/quarantaine"
    # En Ko
    FichierTailleMax="204800"
     
    log_failure()
    {
    	echo "`date` [echec]" >> $logfile
    }
    log_success()
    {
            echo "`date` [succes]" >> $logfile
    }
     
    # Ecriture du contenu du message dans un fichier temporaire
    write_mail_body()
    {
    mail_subject="[$HOSTNAME] Scan antivirus de $ScannedDirectories du $(date)"
     
    cat << EOF >> $mail_body_file
    Scan de $ScannedDirectories du $(date)
    $(cat $bufferlogfile)
    EOF
    }
     
    # Ecriture du contenu du message dans un fichier temporaire
    write_error_body()
    {
    cat << EOF >> $mail_body_file
    Bonjour.
     
    $pidfile existe. Cela indique que le script $PWD/$0 ne s'est pas termine correctement.
     
    Cordialement.
    EOF
    }
     
    # string vide
    if [ -z "$pidfile" ]
    then
    	mail_subject="[$HOSTNAME] Alerte : erreur $pidfile string vide"
    	write_error_body
    	mail -s "$mail_subject" $mailing_list < $mail_body_file
    	log_failure
    	exit 1
    fi
    # fichier existe
    if [ -e "$pidfile" ]
    then
            mail_subject="[$HOSTNAME] Alerte : erreur $pidfile fichier present"
            write_error_body
            mail -s "$mail_subject" $mailing_list < $mail_body_file
    	log_failure
            exit 1
    fi
     
    echo $! > $pidfile
     
    bufferlogfile=$(mktemp)
     
    # SCRIPT
    find $ScannedDirectories -type f -mtime -1 -ctime -1 -print0 | xargs -0 clamscan -v --stdout -l $bufferlogfile --move=$Quarantine --max-filesize=$FichierTailleMax
     
    cat $bufferlogfile >> $logfile
     
    write_mail_body
    mail -s "$mail_subject" $mailing_list < $mail_body_file
     
    log_success
     
    rm -f $pidfile
    rm $bufferlogfile
     
    exit 0

  13. #13
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Nom du script: sauvegarde

    Compatible avec: Bash

    Descriptif: sauvegarde de base de données, de données, ldap, avec rotation des sauvegardes ...

    Pré-requis: rsync, paramétrer les variables du fichier de configuration .dat, renommer en fonction
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
     
    #!/bin/bash
     
    configuration_file="/usr/local/script/sauvegarde.dat"
     
    source $configuration_file
     
    # options de rsync
    RSYNC_OPTIONS="-va --delete --force --ignore-errors"
     
    export PATH=$PATH:/bin:/usr/bin:/usr/local/bin
     
    # Variables dynamiques
    HOSTNAME=$(hostname)
    TMPFILE=$(mktemp -t)
     
    # Variables dependantes d'autres variables
    PURPOSE="[Sauvegarde $HOSTNAME > $DISTANTCOMPUTER]"
    DATEDEBUT=$(date +'%F')
    HEUREDEBUT=$(date +'%T')
    MAILSUBJECT="$PURPOSE[$DATEDEBUT][$HEUREDEBUT>"
     
    # Declarations des fonctions
     
    # renommage du repertoire $ARCHIVEROOT$BACKUPDIR.$1 en $ARCHIVEROOT$BACKUPDIR.$2 si $ARCHIVEROOT$BACKUPDIR.$1 existe
    do_rsync_rotate()
    {
    if [ -d "$ARCHIVEROOT$BACKUPDIR.$1" ]; then
            mv $ARCHIVEROOT$BACKUPDIR.$1 $ARCHIVEROOT$BACKUPDIR.$2 >> $TMPFILE 2>&1
    fi
    }
     
    # rotation des repertoires de sauvegarde s'ils existent 
    do_rsync()
    {
    	echo " Rotation des repertoires $ARCHIVEROOT$BACKUPDIR ">>$TMPFILE
    	# suppression du repertoire 3
    	if [ -d "$ARCHIVEROOT$BACKUPDIR.3" ]; then
    		rm -rf "$ARCHIVEROOT$BACKUPDIR.3" >> $TMPFILE 2>&1
    	fi
    	# renommage du repertoire 2 en repertoire 3
    	do_rsync_rotate 2 3
       	# renommage du repertoire 1 en repertoire 2
    	do_rsync_rotate 1 2
    	# copie du contenu du repertoire 0 en repertoire 1
    	if [ -d "$ARCHIVEROOT$BACKUPDIR.0" ]; then
    		cp -al "$ARCHIVEROOT$BACKUPDIR.0" "$ARCHIVEROOT$BACKUPDIR.1" >> $TMPFILE 2>&1
    	fi
     
    	rsync $RSYNC_OPTIONS $BACKUPDIR "$ARCHIVEROOT$BACKUPDIR.0" 2>&1
    }
     
    # compte rendu de sauvegarde
    do_accounting()
    {
    cat << EOF >> $TMPFILE
     * Repertoire 	Source		: $(du -sh "$BACKUPDIR")
     		Destination	: $(du -sh "$ARCHIVEROOT$BACKUPDIR.0")
    EOF
    }
     
    do_backupfile_rotate()
    {
    if [ -e "$LOCALBACKUPPATH/$BACKUPFILE.$1" ]; then
            mv $LOCALBACKUPPATH/$BACKUPFILE.$1 $LOCALBACKUPPATH/$BACKUPFILE.$2 >> $TMPFILE 2>&1
    fi
    }
     
    do_backupfile()
    {
    	# rotation des fichiers de sauvegarde s'ils existent
    	if [ -e "$LOCALBACKUPPATH/$BACKUPFILE.4" ]; then
                    rm "$LOCALBACKUPPATH/$BACKUPFILE.3" >> $TMPFILE 2>&1
    	fi
    	do_backupfile_rotate 3 4
    	do_backupfile_rotate 2 3
    	do_backupfile_rotate 1 2
    	do_backupfile_rotate 0 1
    	if [ -e "$LOCALBACKUPPATH/$BACKUPFILE" ]; then
                    ln "$LOCALBACKUPPATH/$BACKUPFILE" "$LOCALBACKUPPATH/$BACKUPFILE.0" >> $TMPFILE 2>&1
    	else
    		echo "/!\ Attention, $LOCALBACKUPPATH/$BACKUPFILE n'existe pas." >> $TMPFILE 2>&1
    	fi
    }
     
    # Verification de l'integrite des variables principales
    if_empty_exit()
    {
    if [ -z "$(eval echo $1)" ] ; then
            echo "/!\ $1 est vide." >> $TMPFILE
    	cat $TMPFILE >> $LOGFILE
            DATEFIN=$(date +'%T')
            MAILSUBJECT="$MAILSUBJECT>$DATEFIN] : Echec"
            mail -s "$MAILSUBJECT" $MAILADDR < $TMPFILE
    	exit
    fi
    }
     
    # verification de l'accessibilite d'un repertoire
    if_access_denied_exit()
    {
    ls $(eval echo $1) > /dev/null 2>&1
    if [ $? -ne 0 ]; then
            echo "/!\ acces a $1 impossible." >> $TMPFILE
            cat $TMPFILE >> $LOGFILE
    	DATEFIN=$(date +'%T')
    	MAILSUBJECT="$MAILSUBJECT>$DATEFIN] : Echec"
            mail -s "$MAILSUBJECT" $MAILADDR < $TMPFILE
            exit
    fi
    }
     
    introduction()
    {
    cat << EOF >> $TMPFILE
    ################################################
    Sauvegarde du $DATEDEBUT pour $HOSTNAME:
    ################################################
    EOF
    }
     
    conf_report()
    {
    (test -n "$PSQL_BACKUP_WANTED") && echo "# Sauvegarde Postgresql : $PSQL_DATABASE_NAMES" >> $TMPFILE
    (test -n "$MYSQL_BACKUP_WANTED") && echo "# Sauvegarde MySql : $MYSQL_DATABASE_NAMES" >> $TMPFILE
    (test -n "$LDAP_BACKUP_WANTED") && echo "# Sauvegarde Ldap " >> $TMPFILE
     
    cat << EOF >> $TMPFILE
    ## Fichier de configuration
    # $configuration_file
    ## Fichier temporaire utilise pour les logs
    # $TMPFILE
    ## Fichier de logs
    # $LOGFILE
    ## Repertoire temporaire
    # $TMPDIRECTORY
    ## Repertoire local pour les fichiers des bases de donnees
    # $LOCALBACKUPPATH
    ## Repertoire racine de la sauvegarde distante
    # $ARCHIVEROOT
    # $(mount | grep $MOUNT_POINT)
    ## Liste des repertoires a sauvegarder
    # $directory_list
    ## Adresse mail de rapport
    # $MAILADDR
    ################################################
    EOF
    }
     
    conf_check()
    {
    variable_list="\$configuration_file \$TMPFILE \$LOGFILE \$TMPDIRECTORY \$LOCALBACKUPPATH \$ARCHIVEROOT \$directory_list \$DISTANTCOMPUTER"
    directory_list_to_check="\$TMPDIRECTORY \$LOCALBACKUPPATH \$ARCHIVEROOT"
    	for variable in $variable_list
    	do
    		if_empty_exit $variable
    	done
     
    	for directory in $directory_listt_to_check
    	do
    		if_access_denied_exit $directory
    	done
     
    }
     
    conclusion()
    {
    cat << EOF >> $TMPFILE
     
    ################################################
    Sauvegarde terminee : $(date +'%F a %T')
    ################################################
    EOF
    }
     
    # sauvegarde de la liste des programmes installes
    pkg_list()
    {
    BACKUPFILE="selections"
    cat << EOF >> $TMPFILE
     
    ################################################
    Sauvegarde de la liste des paquets dans $LOCALBACKUPPATH/$BACKUPFILE
    EOF
    dpkg --get-selections > $LOCALBACKUPPATH/$BACKUPFILE
    ls -Al $LOCALBACKUPPATH/$BACKUPFILE >> $TMPFILE 2>&1
    cat << EOF >> $TMPFILE
    ################################################
    EOF
    }
     
    # sauvegarde de la base ldap
    ldap_dump()
    {
    BACKUPFILE="ldap"
    cat << EOF >> $TMPFILE
     
    ################################################
    Sauvegarde de la base ldap dans $LOCALBACKUPPATH/$BACKUPFILE
    EOF
     
    do_backupfile
    slapcat -l $LOCALBACKUPPATH/$BACKUPFILE >> $TMPFILE 2>&1
    ls -Al $LOCALBACKUPPATH/$BACKUPFILE >> $TMPFILE 2>&1
    cat << EOF >> $TMPFILE
    ################################################
    EOF
    }
     
    # sauvegarde des bases de donnees postgresql
    psql_dump()
    {
    cat << EOF >> $TMPFILE
     
    ################################################
    Sauvegarde des bases de donnees POSTGRESQL $PSQL_DATABASE_NAMES  dans $LOCALBACKUPPATH
    EOF
    for BACKUPFILE in $PSQL_DATABASE_NAMES
    do
    	do_backupfile
            echo " * Sauvegarde de la base $BACKUPFILE dans $LOCALBACKUPPATH/$BACKUPFILE" >> $TMPFILE
    	su postgres -c "/usr/bin/pg_dump -d $BACKUPFILE > $TMPDIRECTORY/$BACKUPFILE" >> $TMPFILE 2>&1
            mv $TMPDIRECTORY/$BACKUPFILE "$LOCALBACKUPPATH/$BACKUPFILE" >> $TMPFILE 2>&1
    	ls -Al $LOCALBACKUPPATH/$BACKUPFILE >> $TMPFILE 2>&1
    done
    cat << EOF >> $TMPFILE
    ################################################
    EOF
    }
     
    # sauvegarde des base mysql
    mysql_dump()
    {
    cat << EOF >> $TMPFILE
     
    ################################################
    Sauvegarde des bases de donnees MYSQL $MYSQL_DATABASE_NAMES  dans $LOCALBACKUPPATH
    EOF
     
    for BACKUPFILE in $MYSQL_DATABASE_NAMES
    do
    	do_backupfile
            echo " * Sauvegarde de la base $BACKUPFILE dans $LOCALBACKUPPATH/$BACKUPFILE" >> $TMPFILE
    	mysqldump -u sauvegarde $BACKUPFILE > $TMPDIRECTORY/$BACKUPFILE
    	mv $TMPDIRECTORY/$BACKUPFILE "$LOCALBACKUPPATH/$BACKUPFILE" >> $TMPFILE 2>&1
            ls -Al $LOCALBACKUPPATH/$BACKUPFILE >> $TMPFILE 2>&1
    done
    cat << EOF >> $TMPFILE
    ################################################
    EOF
    }
     
     
    # Test d'accessibilite du media ou l'on sauvegarde
    test_destination()
    {
    # le fait d'etre monte ne signifie pas que cela fonctionne
    # pour tester l'accessibilite ... on essaie d'y acceder
    ls $ARCHIVEROOT > /dev/null 2>&1
    if [ $? -ne 0 ] ; then
     
    cat << EOF >> $TMPFILE
    $(ls $ARCHIVEROOT)
    $ARCHIVEROOT est inaccessible.
    La sauvegarde n'a pas pu avoir lieu.
    EOF
            cat $TMPFILE >> $LOGFILE
            DATEFIN=$(date +'%T')
    	MAILSUBJECT="$MAILSUBJECT>$DATEFIN] :Echec"
            mail -s "$MAILSUBJECT" $MAILADDR < $TMPFILE
            exit
    fi
    }
     
    effective_backup()
    {
    # sauvegardes des repertoires
    cat << EOF >> $TMPFILE
     
    ################################################
    Sauvegarde effective des repertoires $directory_list vers $ARCHIVEROOT
    EOF
     
    for BACKUPDIR in $directory_list
    do
    	do_rsync && do_accounting
    done
    cat << EOF >> $TMPFILE
    ################################################
    EOF
    }
     
    # verification que les repertoires necessaires sont bien presents sur la destination et creation s'ils n'existent pas
    check_destination_directories()
    {
    upper_dir=""
    #echo "\$directory_list = $directory_list"
    for i in $directory_list
    do
    upper_dir="$upper_dir $( dirname $i | sed '/^\/$/d' )"
    done
    final_upper_dir_list=$(echo $upper_dir | sed 's/ /\
    /g' | uniq)
     
    for i in $final_upper_dir_list
    do
    #	echo "\$ARCHIVEROOT = $ARCHIVEROOT \$i = $i"
    	if [ ! -d "$ARCHIVEROOT$i" ] ; then
    		echo "/!\ Attention le script de sauvegarde cree un repertoire $ARCHIVEROOT$i" >> $TMPFILE
            	mkdir -p $ARCHIVEROOT$i >> $TMPFILE 2>&1
    	fi
    done
    }
     
    # Envoi du mail signalant la reussite de la sauvegarde
    final_mail()
    {
    	DATEFIN=$(date +'%T')
    	MAILSUBJECT="$MAILSUBJECT>$DATEFIN] : Succes"
    	mail -s "$MAILSUBJECT" $MAILADDR < $TMPFILE
    }
     
    # Ecriture du contenu du message dans un fichier temporaire
    write_error_body()
    {
    cat << EOF >> $TMPFILE
     
    Bonjour.
     
    $mypidfile existe. Cela indique que le script ne s'est pas termine correctement.
     
    Cordialement.
     
    EOF
    }
     
    # string vide
    if [ -z "$mypidfile" ]
    then
    	MAILSUBJECT="[$HOSTNAME] Alerte : erreur $pidfile"
    	write_error_body
    	mail -s "$MAILSUBJECT" $MAILADDR < $TMPFILE
    	exit 1
    fi
    # fichier existe
    if [ -e "$mypidfile" ]
    then
            MAILSUBJECT="[$HOSTNAME] Alerte : erreur $pidfile"
            write_error_body
            mail -s "$MAILSUBJECT" $MAILADDR < $TMPFILE
            exit 1
    fi
     
    echo $! > $mypidfile
     
     
    # ecriture du debut de la sauvegarde dans le fichier temporaire
    introduction
     
    # Rapport de la configuration de la sauvegarde
    conf_report
     
    # Verification qu'on n'a pas des variables importantes manquantes
    conf_check
     
    # sauvegarde de la liste des programmes installes
    pkg_list
     
    # sauvegarde de la base ldap
    (test -n "$LDAP_BACKUP_WANTED") && ldap_dump
     
    # sauvegarde des base postgresql
    (test -n "$PSQL_BACKUP_WANTED") && psql_dump
     
    # sauvegarde des base postgresql
    (test -n "$MYSQL_BACKUP_WANTED") && mysql_dump
     
     
    # test accessibilite du repertoire destination
    test_destination
     
    # test de presence des repertoires necessaires a la sauvegarde dans la destinations
    check_destination_directories
     
    # la sauvegarde commence vraiment, les fichier sont transferes vers leur destination
    effective_backup
     
    # ecriture de la fin de la sauvegarde dans le fichier temporaire
    conclusion
     
    # le fichier ou l'on a enregistre le deroulement et concatene au fichier de log
    cat $TMPFILE >> $LOGFILE
     
    # envoi d'un mail pour prevenir
    final_mail
     
    rm -f $mypidfile
    Code du fichier de configuration sourcé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #!/bin/bash
    MAILADDR=administrateur@mondomaine.fr
     
    ## Repertoire accessible, de preferance distant, un partage nfs fait tres bien le travail
    ARCHIVEROOT=/mnt/sauvegarde_distante/nommachinesauvegardee
    MOUNT_POINT=/mnt/sauvegarde_distante
     
    ## machine laquelle on sauvegarde. Elle peut ne pas etre distante.
    ## ce parametre ne rentre pas en ligne de compte pour la sauvegarde, il est uniquement la a titre informatif. Le montage d'ARCHIVEROOT n'est pas integre au script donc ca n'est pas dynamique. Ce parametre influe sur le nom du logname et sur le contenu du titre du mail
    DISTANTCOMPUTER=nommachinedistante
     
    myscriptname="sauvegarde"
    mypidfile="/var/run/$myscriptname.pid"
     
     
    ## Fichiers de logs, la compte rendu n'y est copie qu'une fois la sauvegarde achevee
    ## il contient toutes les comptes rendus de sauvegardes precedents
    ## un fichier temporaire est utilise pour l'envoi du mail, il sera naturellement nettoye par la crontab
    ## on envoie le nom de ce fichier pour analyser les erreurs eventuelles qui n'aurait pas pu etre
    ## repercutee dans le fichier de log
    LOGFILE="/var/log/localscript/sauvegarde/vers_$DISTANTCOMPUTER.log"
     
    ## repertoire utilise pour la copie des bases de donnees. Il est accessible par tout le monde
    ## l'avantage etant que pour generer les dump, il faut endosser l'identite d'un utilisateur
    ## autre que root
    TMPDIRECTORY=/tmp
     
    ## repertoire local pour les sauvegardes de base de donnees
    LOCALBACKUPPATH=/home/fauxutilisateur
     
    ## liste des repertoires a sauvegarder
    directory_list="/root /home /etc /et/encore/des/chemins"
     
    ## si ces variables sont non vides, on sauvegarde la bdd associee
    LDAP_BACKUP_WANTED="OK"
    #MYSQL_BACKUP_WANTED="OK"
    PSQL_BACKUP_WANTED="OK"
     
    ## liste des noms de bases de donnees
    PSQL_DATABASE_NAMES="nomdebasededonnes"
    #MYSQL_DATABASE_NAMES="blabla"

  14. #14
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Nom du script : libadialog

    Compatible : bash

    Descriptif : Bibliothèque d'abstraction des logiciels "dialog" (xdialog, zenity, kdialog, dialog, console (manually with bash), wish)

    Pré-requis : Cela dépend l'affichage qu'on souhaite. On peut n'utiliser que le mode "console" par exemple. Je n'ai pas testé depuis un moment mais cela doit fonctionner encore aujourd'hui. (il peut y avoir des bugs)

    Lien : http://nyal.developpez.com/mplayer/d...r-setup.tar.gz

    Il y'a un fichier "sh" selon le mode qu'on souhaite. Par exemple, si on veut la version "console", on doit utiliser "console_func.sh".
    Vous trouverez des screenshots ici : http://nyal.developpez.com/mplayer/i...age=screenshot

    Exemple d'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #!/bin/bash
     
    . console_func.sh
     
    info_text "YES" "Welcome!!!"
     
    id=`question_select "Proxy Support" "Did you use a Proxy ?"`
    return_value=$?
    echo "question return = $return_value" > /tmp/result.txt
     
    PATH_TO_DECOMPRESS=`entry_text "Config Install" "Choose the Path to decompress archives" "TEST"`
    return_value=$?
    echo "entry result = $PATH_TO_DECOMPRESS" >> /tmp/result.txt
    echo "entry return = $return_value" >> /tmp/result.txt
     
    checklist="TRUE \"test 1\"
    FALSE \"test 2\""
    selection=`checklist_select "test" "Information" "$checklist"`
    return_value=$?
    echo "checklist result = $selection" >> /tmp/result.txt
    echo "checklist return = $return_value" >> /tmp/result.txt
     
    # BUG!!!!
    size=`radiolist_select "Local Installation" "Choose Size of Font" "TRUE 14
    FALSE 18
    FALSE 24
    FALSE 28"`
    return_value=$?
    echo "radiolist result = $size" >> /tmp/result.txt
    echo "radiolist return = $return_value" >> /tmp/result.txt
     
    selection=`files_selection "My Install" "Select Files"`
    return_value=$?
    echo "selection result = $selection" >> /tmp/result.txt
    echo "selection return = $return_value" >> /tmp/result.txt

  15. #15
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut Mise à jour des règles de SELinux
    Bonjour,

    Nom du script: SEupdate

    Compatible avec: Bash

    Descriptif: Met à jour les règles de SELinux lorsqu'une nouvelle application veut accéder à un fichier sensible que SELinux interdit. Le script crée simplement les nouvelles règles et donne la commande pour les appliquer.

    Pré-requis: Avoir SELinux qui tourne, bien sûr. Normalement, les alarmes arrivent dans /var/log/audit/audit.log. Si ce n'est pas le cas, changer le script et mettre à la place /var/log/messages.

    Environnement: j'ai mis le script dans /root/selinux. Deux fichiers sont créés et doivent rester là pour l'exécution suivante, lorsqu'une prochaine alarme surviendra.

    Lancement du script: La première fois, le fichier en paramètre n'existe pas. Ce n'est pas grave, il sera créé à la fin du script.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sudo -i               # si le fichier /etc/sudoers est bon, passage root sans mot de passe :-)
    cd selinux            # j'ai mis l'exéctable dans /root/selinux
    ./SEupdate selinux.te # lancement du script avec le nom du fichier de règles
    Code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    #!/bin/bash
    
    # init
    execName=$(basename $0)
    tmpDir=$(mktemp -d /tmp/$execName.XXXXXX)
    tmpFile=$tmpDir/$execName
    
    # manage arguments
    if [[ $# != 1 ]]
    then
      echo "Usage: $execName <Type_Enforcement_file>"
      exit 1
    fi
    dstDir=$(dirname $1)
    dstFile=$(basename $1)
    dstFile=${dstFile%.te}
    if [[ ! -s $1 ]]
    then
      echo "WARNING: <Type_Enforcement_file> non-existent or empty, creating it..."
      touch $1
    fi
    cp $1 $tmpFile.te.src
    
    # create new type enforcement file from audit file
    audit2allow -m local -l -i /var/log/audit/audit.log > $tmpFile.te.add
    
    # set header file
    echo "
    module local 1.0;
    
    require {" > $tmpFile.te.new
    
    # format and merge type lines
    awk '
    /^[[:space:]]*type / \
    {
      sub("^[[:space:]]*", " ")
      print
    }' $tmpFile.te.src > $tmpFile.type.src
    awk '
    /^[[:space:]]*type / \
    {
      sub("^[[:space:]]*", " ")
      print
    }' $tmpFile.te.add > $tmpFile.type.add
    sort -u -k 2,2 $tmpFile.type.src $tmpFile.type.add >> $tmpFile.te.new
    
    # format and merge class lines
    awk '
    /^[[:space:]]*class / \
    {
      sub("^[[:space:]]*", " ")
      if ($0 !~ "[{}]")
      {
        $2=$2 " {"
        if (length($NF) == 1) $NF="}" $NF
        else sub(".$", " };", $NF)
      }
      print
    }' $tmpFile.te.src | sort -k 3,3 > $tmpFile.class.src
    awk '
    /^[[:space:]]*class / \
    {
      sub("^[[:space:]]*", " ")
      if ($0 !~ "[{}]")
      {
        $2=$2 " {"
        if (length($NF) == 1) {$NF="}" $NF}
        else {sub(".$", " };", $NF)}
      }
      print
    }' $tmpFile.te.add | sort -k 3,3 > $tmpFile.class.add
    [[ ! -s $tmpFile.class.src ]] && cp $tmpFile.class.add $tmpFile.class.src
    while read srcLine
    do
      options=$(echo "$srcLine" | awk '
        BEGIN {OFS="\n"}
        {
          for (i=4; i<NF; i++) {print $i}
        }')
      className=$(echo "$srcLine" | awk '{print $2}')
      addOptions=$(awk -v c=$className '
        BEGIN {OFS="\n"}
        $2 == c \
        {
          for (i=4; i<NF; i++) {print $i}
        }' $tmpFile.class.add)
      [[ -n $addOptions ]] && options+=$'\n'$addOptions
      line=" class $className { $(echo "$options" | sort -u | tr "\n" " ")};"
      echo "$line" >> $tmpFile.te.new
    done < $tmpFile.class.src
    
    # close require block
    echo "}" >> $tmpFile.te.new
    
    # sort rules and format options
    awk '
    /^allow / \
    {
      if ($4 !~ "^{")
      {
        $4="{ " $4
        sub(".$", " };", $NF)
      }
      print
    }' $tmpFile.te.src $tmpFile.te.add |
      sort -k 2,3 > $tmpFile.te.rules
    
    # merge rules with same first three fields
    cp -f $tmpFile.te.rules $tmpFile.te.rules.to.merge
    > $tmpFile.te.rules.merged
    while read ruleLine
    do
      selector=$(echo $ruleLine | cut -d " " -f 1-3)
      options=$(awk -v s="$selector" '
        BEGIN {OFS="\n"}
        {
          if ($0 ~ "^"s) {for (i=5; i<NF; i++) {print $i}}
        }' $tmpFile.te.rules.to.merge)
      mergedOptions=$(echo "$options" | sort -u | tr "\n" " ")
      echo "$selector { $mergedOptions };" >> $tmpFile.te.rules.merged
      sed -i '/^'"$selector"'/d' $tmpFile.te.rules.to.merge
    done < $tmpFile.te.rules
    sort -u -k 1,3 $tmpFile.te.rules.merged > $tmpFile.te.rules.uniq
    
    # format rules by blocks
    awk '
    {
      if ($2 != prevApp)
      {
        prevApp=$2
        printf "\n#============= %s ==============\n", $2
      }
      print
    }' $tmpFile.te.rules.uniq >> $tmpFile.te.new
    
    # compile file
    checkmodule -M -m -o $tmpFile.mod $tmpFile.te.new
    
    # create policy package file
    semodule_package -o $tmpFile.pp -m $tmpFile.mod
    
    # replace policy package file
    cp -f $tmpFile.pp $dstDir/$dstFile.pp
    
    # replace type enforcement file
    cp -f $tmpFile.te.new $dstDir/$dstFile.te
    
    # clean temp dir up
    rm -rf $tmpDir
    
    # tell the next step to do, to install updated SELinux rules
    echo "Now, run the command 'semodule -i $dstDir/$dstFile.pp'"
    J'ai débugué au mieux, mais peut-être reste-t-il encore des erreurs. Si vous en trouvez, dites-le moi.

  16. #16
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut Script Shell last_files_list
    Mon premier script de super noob, merci pour l'accueil modéré

    Nom du script: last_files_list <n_minutes>

    Compatible avec: sh

    Descriptif: permet de lister les fichiers vieux de n minutes pour une utilisation sur certaines distro "allégées", par ex celles des NAS, qui ne comportent pas la commande FIND avec toutes les options ( et notamment -amin -mmin -cmin...) permettant justement de lister les fichiers de moins de 1 jour.

    Pré-requis: void

    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    #!/bin/sh
     
    # *******************************************************************
    # *		LOOK FOR THE LAST MODIFIED FILES since m minute_nows			*
    # *		FIND cmde is uncomplete on the QNAP Linux version			*
    # *		script call : my_find_lasted_files m, where m=minute_nows		*
    # *		bug included: do not work for midnight research... (hour = 00) *
    # *******************************************************************
     
    # ***************************
    # *		INIT & GET TIME		*
    # ***************************
    month_now=`date | awk '{print $2}'`
    day_now=`date | awk '{print $3}'`
    hour_now=`date | awk '{print $4}' | cut -d ':' -f 1`
    minute_now=`date | awk '{print $4}' | cut -d ':' -f 2`
    second_now=`date | awk '{print $4}' | cut -d ':' -f 3`
    today_nowsfiles="/tmp/today_nowsfiles"
    found_files="/tmp/foundfiles"
    [[ -e $found_files ]] && rm $found_files
    [[ -e $today_nowsfiles ]] && rm $today_nowsfiles
     
    # format the input parameter required for the next search function : add a blank space if m-minute_now < 10
    if [ ! -z $1 ]
    then
    	if [ $1 -lt 10 ]
    	then
    		newerthan="0$1"
    	elif [ $1 -lt 60 ]
    	then
    		newerthan="$1"
    	else
    		newerthan="59"
    	fi
    else
    	newerthan="05" #seek for files newer than 5 minute_nows
    fi
     
    # End searching time
    hour_end=$hour_now
    minute_end=$minute_now
     
    # Start searching time
    if [ $minute_now -gt $newerthan ]
    then
    	hour_start=$hour_now
    	let "minute_start=$minute_now-$newerthan"
    else
    	if [ $hour_now -gt 01 ]
    	then
    		let "hour_start=$hour_now-1"
    		let "minute_start=60-$newerthan+$minute_now"
    	else
    		let "hour_start=0"
    		let "minute_start=60-$newerthan+$minute_now"
    	fi
    fi
     
    # Convert time into minutes
    if [[ $minute_start -lt 10 ]]
    then
    	minute_start="0$minute_start"
    fi
    let "start_research_time=60*hour_start+$minute_start"
    let "end_research_time=60*hour_end+$minute_end"
     
    # debug
    # echo "now $hour_now:$minute_now"
    # echo "start $hour_start:$minute_start"
    # echo "end $hour_end:$minute_end"
     
    # format the spacer required for the next search function : add a blank space if d-day_now < 10 of the month_now
    if [ $day_now -lt "10" ]
    then
    spacer="  "
    else
    spacer=" "
    fi
     
    # debug
    # echo "grep $month_now$spacer$day_now"
     
    # get names of the files of today_now
    # ls -ltsha | grep "$month_now$spacer$day_now" | awk '{print $10}'
     
    # get hh:mm of the files of today_now
    # ls -ltsha | grep "$month_now$spacer$day_now" | awk '{print $9}'
     
    # get hh of the files of today_now
    # ls -ltsha | grep "$month_now$spacer$day_now" | awk '{print $9}' | cut -d ':' -f 1
     
    # get mm of the files of today_now
    # ls -ltsha | grep "$month_now$spacer$day_now" | awk '{print $9}' | cut -d ':' -f 2
     
    # ***************************************
    # *	User msg						 	*
    # ***************************************
    echo "Looking for files having been modified over the last $newerthan minutes between $hour_start:$minute_start and $hour_end:$minute_end ... pls wait"
     
     
    # *******************************************
    # *	list of last 2 hours modified files 	*
    # *******************************************
    # Nota : add option -u to get last accessed time, instead of getting the file last modified time (by default)
    echo "Building list ..."
    ls -RltshaA 2>/dev/null | grep "$month_now$spacer$day_now $hour_start" > $today_nowsfiles
    ls -RltshaA 2>/dev/null | grep "$month_now$spacer$day_now $hour_end" >> $today_nowsfiles
     
    # debug
    # cat $today_nowsfiles | more
    # exit
     
    # *******************************************************
    # *	Seek for files newer than $newerthan in the list	*
    # *******************************************************
    let "count=1"
    nb_of_files_today_now=`cat $today_nowsfiles | wc -l`
    touch $found_files
     
    while read file_line_i
    do
    	# get the file informations
    	file_hour_i=`echo $file_line_i | cut -d ' ' -f 9 | cut -d ':' -f 1`
    	file_minute_i=`echo $file_line_i | cut -d ' ' -f 9 | cut -d ':' -f 2`
    	let "file_time_i=60*$file_hour_i+$file_minute_i"
    	file_name=`echo ${file_line_i##* }`
    	file_size=`echo $file_line_i | cut -d ' ' -f 6`
     
    	if [[ $file_time_i -ge $start_research_time ]] && [[ $file_time_i -le $end_research_time ]]
    	then
    		in_the_range=true
    	else
    		in_the_range=false
    	fi
     
    	# record files in the time range
    	if [[ $in_the_range ]]
    	then
    		if [ -f $file_name ] && [ ! -L $file_name ] && [ $file_name != "." ] && [ $file_name != ".." ]  && [ $file_name != "0" ] && [ $file_name != $found_files ] && [ $file_name != $today_nowsfiles ] && [ $file_size != "0" ]
    		then
    			echo "found: $file_line_i"
    			echo -e "file $count: $file_line_i" >> $found_files
    			let "count=$count+1"
    		fi
    	fi
    done < $today_nowsfiles
     
    # *******************
    # *	Show results	*
    # *******************
    nb_files_found=`cat $found_files | wc -l`
    echo "cat $found_files | more"
    echo "----------------------------------------------------------------------------------"
    echo "$nb_files_found modified files in the last $newerthan minutes between $hour_start:$minute_start and $hour_end:$minute_end"
    cat $found_files | more
    echo "----------------------------------------------------------------------------------"
     
    # *******************
    # *	clean & Get out	*
    # *******************
    rm $found_files
    rm $today_nowsfiles
    exit
    et le bonus du Super Noob: afficher l'arborescence :
    ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ * /' -e 's/-/|/'

  17. #17
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut shell - interpretation des caracteres speciaux
    Nom du script: essai.ksh

    Compatible avec: ksh

    Descriptif: exporter des variables dans un fichier.
    Le probleme est que le(s) caractere(s) * sont interpretes dans
    la chaine OA_REMOVE_FILES_CRON alors que je souhaiterai voir
    dans la premier for un affichage de la chaine
    OA_REMOVE_FILES_CRON (cad: 0 1 * * *)
    et dans le deuxieme for, un affichage de la chaine
    (dans le fichier FILE_ENV)
    export OA_REMOVE_FILES_CRON="0 1 * * *"
    Merci de votre aide
    Hervé

    Pré-requis: aucun

    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    FILE_ENV=/tmp/OA.log
     
    OAOPTIONLIST="OA_REMOVE_FILES_CRON"
     
     
    if [ -z "$OA_REMOVE_FILES_CRON" ]; then
         OA_REMOVE_FILES_CRON="0 1 * * *"
    fi
     
    echo "Loaded environment variables are:"
    for var in $OAOPTIONLIST
    do
        if [ -n "$(eval echo \$$var)" ]; then
          echo "  $var=$(eval echo \$$var)"
        fi 
    done 
     
    # Add to environment file the OA_ variables (without code markers)
      for option in $OAOPTIONLIST
      do
        option_value=`eval echo '$'$option`
        if [ "$option_value" != "" ];then
           echo "export $option=\"$option_value\"" >> $FILE_ENV
        fi
      done

  18. #18
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    Nom du script: ip wan

    Compatible avec: sh

    Descriptif: permet d'obtenir son IP publique, utile notamment derrière un firewall et quand on n'a qu'une busybox basique avec seulement nc (et donc sans wget par exemple..).

    Pré-requis: void

    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/sh
    FILE=http_req2.txt
    echo "GET /automation/n09230945.asp HTTP/1.0" > $FILE
    echo "Host: www.whatismyip.com" >> $FILE
    echo -e "\n\n" >> $FILE
    IP=$(cat $F2 | nc www.whatismyip.com 80 | tail -n 1)
    echo "ip publique: $IP"
    exit 0
    EDIT: pas testé en bash, car pas d'intérêt (wget) mais ça devrait fonctionner tel quel.
    EDIT2: en bash c'est l'histoire d'une ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SERVER_IP=$(wget -q http://www.monip.org/ -O- | grep "IP :" | cut --characters=-80 | sed -e 's/^.* \(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*$/\1/')

  19. #19
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    C'est ma journée créativité :-)

    Nom du script: my_bash_cleanup

    Compatible avec : bash

    Descriptif:
    "nettoie" un fichier bash en supprimant les lignes de commentaires et les lignes vides. Utile avant une mise en production par exemple. Le fichier d'origine est conservé bien sûr. Il y a moyen de faire nettement mieux, c'est clair. Mais j'ai voulu décomposer.

    Pré-requis:
    perl (uniquement pour l'aspect "graphique" du script, sinon, juste supprimer la ligne "local underline=`perl...")

    Points d'intérêt:
    • Les commandes stat et sed.

    • La récupération/duplication des droits et owner du fichier d'origine. Comme je n'ai pas utilisé l'option "-i" de sed mais des cp/mv, les droits d'origine se perdent du fait de l'utilisateur (sudo => root) executant le script. Il faut donc les rétablir à l'identique du fichier orginal.


    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    #!/bin/bash
     
    # ################################################################################
    # CLEAN UP BASH SCRIPTs for production purposes
    # usage: my_bash_cleanup <local_file_path>
    # ################################################################################
     
     
    # ################################################################################
    # TODO
    # adapt to other coding languages (like php, js and perl for example)
    # ################################################################################
     
    # ################################################################################
    # CHANGE LOGS
    # 03/12/2010: release 1.0
    # ################################################################################
     
    function next_step(){
    	local msg=$1
    	local FG_color="1;30m"
    	local BG_color="40m"
    	let STEP="$STEP+1"
    	local mystring="\n# sub-step $STEP : $msg"
    	local length=${#mystring}
    	local underline=`perl -e "print '-' x $length;"`
    	echo -ne "\033[$FG_color\033[$BG_color$underline\033[00m"
    	echo -ne "$mystring\033[00m"
    }
     
    next_step "RUN $0\n"
     
    #
    # Input datas
    #
    next_step "Control input datas"
    FILE2CLEAN=$1
    EXEC_MODE="manual"
    TMP_DIR=/tmp
    MODIFIER=".mod"
    echo
     
    #
    # Define standard Cleaned FILENAME
    #
    next_step "Rename file to clean: "
    BASENAME=$(basename $FILE2CLEAN)
    SOURCE_DIR=$(dirname $FILE2CLEAN)
    FILE_CLEANED=${BASENAME%\.*}"_cleaned."${BASENAME##*.}
    echo "done ($FILE_CLEANED)"
     
    #
    # check file (existing, regular and not empty)
    #
    next_step "Check if $FILE2CLEAN is a regular file: "
    [ ! -e $FILE2CLEAN ] && echo "$0: file not existing" && exit 1
    [ ! -f $FILE2CLEAN ] && echo "$0: file is not a regular file (directories or /dev files not allowed)" && exit 1
    [ ! -s $FILE2CLEAN ] && echo "$0: file is empty" && exit 1
    echo "Ok"
     
    #
    # secure file: not possible to clean root owned files
    #
    next_step "Check $FILE2CLEAN owner: "
    OWNER=$(ls -o $FILE2CLEAN | cut -d" " -f3)
    GROUP=$(ls -l $FILE2CLEAN | cut -d" " -f4)
    RECTAL_PERM=$(stat -c '%a' $FILE2CLEAN)
    [ "$OWNER" = "root" ] && echo "$0: not allowed to be cleaned (owner= root)" && exit 1
    echo "Ok (not belongs to root)"
     
    #
    # backup the original file to tmp
    #
    next_step "Backup $FILE2CLEAN :"
    cp -p $FILE2CLEAN $TMP_DIR/$BASENAME
    cp -p $FILE2CLEAN $TMP_DIR/$FILE_CLEANED
    FILE_CLEANED=$TMP_DIR/$FILE_CLEANED
    echo "done"
     
    #
    # COMMENTS clean up (only lines starting with comments, not inline comments)
    #
    next_step "Remove commented lines except shebang :"
    REMOVE_COMMENTS='1p; /^[[:blank:]]*#/d; s/[[:blank:]][[:blank:]]*#.*//'
    cat $FILE_CLEANED | sed "$REMOVE_COMMENTS" > $FILE_CLEANED$MODIFIER
    mv $FILE_CLEANED$MODIFIER $FILE_CLEANED
    echo "done"
     
    #
    # CHECK SHEBANG PRESENCE
    #
    # TODO
     
    #
    # REMOVE empty lines
    #
    next_step "remove empty lines :"
    REMOVE_EMPTYLINES="/^$/d"
    cat $FILE_CLEANED | sed -e "$REMOVE_EMPTYLINES" >  $FILE_CLEANED$MODIFIER
    mv $FILE_CLEANED$MODIFIER $FILE_CLEANED
    echo "done"
     
    #
    # ADD std "headers" (eg. copyright, owner, date...)
    #
     
    #
    # Save the cleaned file back to the source directory
    #
    next_step "Copy cleaned file to source directory $SOURCE_DIR:"
    cp $FILE_CLEANED $SOURCE_DIR
    echo "done"
     
    #
    # CHMOD/CHOWN
    #
    next_step "Set cleaned file permissions and owner :"
    NEW_BASENAME=$(basename $FILE_CLEANED)
    NEW_PATH=$(find $SOURCE_DIR -type f -name $NEW_BASENAME)
    [ -f $NEW_PATH ] && chown $OWNER:$GROUP $NEW_PATH && chmod $RECTAL_PERM $NEW_PATH
    echo "done"
     
    #
    # SHOW changes
    #
    # TODO
     
    #
    # LOG changes
    #
    # TODO
     
     
    #
    # Remove tmp files
    #
    next_step "Remove tmp files :"
    [ -f $FILE_CLEANED$MODIFIER ] && rm $FILE_CLEANED$MODIFIER
    # TODO rm other created files
    echo "done"
     
    #
    # Closure
    #
    echo "end"
    exit 0

  20. #20
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut SVN
    Nom du script: my_svn_install.sh

    Compatible avec : sh

    Descriptif:
    Installe/configure un serveur svn sous Apache2 sur une Debian Lenny.

    Pré-requis:
    Distro Debian
    Serveur Apache2 fonctionnel

    Points d'intérêt:
    * Les packages nécessaires/pré-requis pour svn
    * J'ai écrit un script similaire, peut-être plus complet, pour TRAC, ainsi que 2 autres scripts pour ajouter des serveurs svn et TRAC aux existants.


    Avertissements:
    Je poste le script car plusieurs personnes me l'ont demandé : il fonctionne sur mon serveur, cependant ce type d'installation reste étroitement lié à votre config, il est donc fortement recommandé de bien comprendre ce que vous faites, bien relire le shell avant execution, et adapter ce qui doit l'être, comme par exemple, la création du vhost Apache. (Step 13)
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Script shell
    Par anzar dans le forum Linux
    Réponses: 4
    Dernier message: 03/12/2004, 14h41
  2. [JSP] script shell
    Par goolix dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 06/08/2004, 09h08
  3. Exécution d'un script shell
    Par Manu0086 dans le forum Linux
    Réponses: 8
    Dernier message: 15/06/2004, 16h31
  4. Explication script shell
    Par crasho007 dans le forum Linux
    Réponses: 2
    Dernier message: 14/06/2004, 13h54
  5. Cron + terminal + script shell
    Par nicolas.pissard dans le forum Linux
    Réponses: 3
    Dernier message: 17/03/2004, 09h24

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