Outils pour utilisateurs

Outils du site


scripts-bash

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Révision précédente
scripts-bash [2018/04/12 13:27]
scripts-bash [2023/05/07 18:55] (Version actuelle)
pielo [Scripts bash]
Ligne 1: Ligne 1:
 +====== Scripts bash ======
 +
 +===== Changer le propriétaire de fichiers dans un stockage objet monté en S3FS =====
 +
 +Sources
 +- https://stackoverflow.com/questions/65217118/using-find-to-locate-files-not-owned-by-user-or-group
 +- https://stackoverflow.com/questions/30733158/s3fs-recursive-chown-chmod-takes-a-long-time
 +- https://stackoverflow.com/questions/66079888/chmod-chown-is-slow-on-files-stored-using-s3fs-on-ec2
 +
 +<code bash>
 +my_directory=<my_directory>
 +my_user=<my_user>
 +my_group=<my_group>
 +find $my_directory \( ! -user $my_user -o ! -group $my_group \) -print0 | xargs -0 --max-args=1 --max-procs=10 chown -v $my_user:$my_group
 +</code>
 +===== Supprimer des fichiers en série =====
 +<code bash>
 +#!/bin/bash
 +cd /var/mail/virtual/map3.net/save/new
 +P=0
 +T=`ls|wc -l`
 +echo "$T fichiers total"
 +Q=0
 +for i in *;
 +  do
 +   let "Q += 1"
 +     let "R = $Q % 1000"
 +     if [ "$R" -eq 0 ]
 +     then
 +       echo "$Q/$T scannes, $P supprimes"
 +     fi
 +
 +   if grep -F "htdocs/egroupware" $i > /dev/null;
 +   then
 +     rm $i;
 +     let "P += 1"
 +   fi
 +  done
 +</code>
 +
 +
 +===== Supprimer la pièce jointe d'un email et le réexpédier =====
 +
 +<code bash>
 +#On regarde dabord à quelles lignes se trouvent les limites de contenu de lemail
 +#+ ces lignes commencent par --boundary
 +
 +
 +fichier="fax-email-test"
 +
 +#on récupère le numéro de ligne du premier boundary
 +ligne1=`grep -m2 -n -e'--boundary' $fichier | sed -n '1 p' | awk --field-separator=":" '{print $1}'`
 +
 +#Ensuite on récupère le numéro de ligne du deuxième boundary
 +ligne2=`grep -m2 -n -e'--boundary' $fichier | sed -n '2 p' | awk --field-separator=":" '{print $1}'`
 +
 +#On affiche les lignes de lemail entre le premier et le deuxième boundary
 +
 +let ligne1=ligne1+1
 +let ligne2=ligne2-1
 +sed -n ' '"$ligne1"','"$ligne2"' p' <$fichier
 +</code>
 +
 +
 +
 +
 +===== Traitement d'un fichier texte =====
 +
 +<code bash>
 +#Deuxième partie traitement d'un fichier
 +#Préférer l'utilisation du code retour du script
 +#pour tester la fin de fichier, ça permet d'avoir des lignes
 +#vides dans le fichier
 + 
 +cat donnees | while true; do    # on dump le fichier
 +read ligne
 +        if [ "$ligne" == "" ] ;then
 +         exit 0                 #On a atteint la fin de fichier
 +                                #Attention il ne faut pas de lignes vides
 +                                #dans le fichier
 +        fi
 +
 +set --­­ $ligne                   #On split les valeurs de la ligne lue
 +                                #dans des variables $1, $2...
 +                                #voir man bash pour la commande set
 +                                #il ne reste plus qu'à afficher
 +        if [ $2 ­-ge 10 ]; then  #si supérieur ou egal on affiche
 +           echo ­-e "$1 \t $2"   #-­e pour avoir le caractère de tabulation
 +        fi
 +done 
 +</code>
 +
 +
 +===== Chiffrer un fichier texte =====
 +<code bash>
 +#!/bin/bash
 +#Script d'ouverture du fichier de mots de passe
 +
 +gpg motsdepasse.txt.gpg
 +nano motsdepasse.txt
 +gpg -er user@domaine motsdepasse.txt
 +rm motsdepasse.txt
 +</code>
 +
 +
 +
 +
 +===== Sauvegardes incrémentales avec rsync =====
 +<code bash>
 +#!/bin/bash
 +#Script de sauvegardes incrémentales
 +#paramètres obligatoires : 1- fréquence (daily|weekly|monthly),
 +#                          2 - nombre de sauvegardes à conserver
 +##
 +#Auteur : Thierry Kauffmann
 +#
 +##
 +#    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 2 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, write to the Free Software
 +#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 +##
 +
 +case $1 in
 +
 +  "daily" | "weekly" | "monthly" )
 +  freq=$1
 +  ;;
 +
 +  *)
 +  echo "usage $0 daily|weekly|monthly nombre_de_sauvegardes"
 +  exit 1;
 +  ;;
 +
 +esac
 +
 +#Nombre de sauvegardes
 +glisse=$2
 +
 +#Liste des répertoires à sauvegarder sur votre système séparés par des espaces
 +source="/home /var"
 +
 +#  Vous devez créer des répertoires de sauvegarde du type
 +#> daily-backup, weekly-backup, monthly-backup
 +
 +cible=/mnt/backup/${freq}-backup
 +
 +
 +cd $cible
 +
 +#On calcule le nombre de répertoires de sauvegarde existants
 +nsauv=`ls | wc -w`
 +
 +#  S'il y a suffisamment de sauvegardes,
 +#> On supprime le répertoire le plus ancien
 +
 +if [ "$nsauv" -ge "$glisse" ]; then
 +
 +oldest=`ls -tr --time=ctime | head -1`
 +rm -rf $oldest
 +
 +fi
 +
 +#On note le répertoire de sauvegarde le plus récent
 +recent=`ls -t --time=ctime | head -1`
 +
 +# On crée un nouveau répertoire de sauvegarde
 +new="$freq-backup-`date +%Y-%m-%d-%R:%S`"
 +
 +#On copie en hard-links le plus récent vers le nouveau
 +cp -al $recent $new
 +
 +#On fait la sauvegarde incrémentale
 +rsync -avP --delete $source $cible/$new/
 +
 +
 +</code>
 +
 +
 +===== Compter le nombre de fichiers dans un dossier =====
 +
 +<code bash>
 +#!/bin/bash
 +IFS=''
 +ls -a1 | while read n; do echo `find $n | wc -l` $n; done| sort -n
 +</code>
 +
 +===== Synchroniser 2 fichiers de type "block-device" =====
 +
 +C'est la seule chose que rsync ne sache pas faire ...
 +
 +<code bash>
 +#!/bin/bash
 +#Incremental distant backup of block devices
 +#Adapted from : Stephane Chazelas stephane.chazelas at seebyte.com ; https://lists.samba.org/archive/rsync/2010-June/025164.html
 +
 +
 +[[ -z "$1" ]] && { echo "Required first argument is source dev"; exit 1; }
 +[[ -z "$2" ]] && { echo "Required second argument is remote dev"; exit 1; }
 +
 +dev1=$1
 +dev2=$2
 +remote=backup@backup
 +
 +ssh $remote "perl -'MDigest::MD5 md5' -ne 'BEGIN{\$/=\1024};print md5(\$_)' $dev2 | lzop -c" | \
 +    lzop -dc | perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};$b=md5($_); read STDIN,$a,16;if ($a eq $b) {print "s"} else {print "c" . $_}' $dev1 | lzop -c | \
 +    pv | \
 +    ssh $remote "lzop -dc | perl -ne 'BEGIN{\$/=\1} if (\$_ eq\"s\") {\$s++} else {if (\$s) { seek STDOUT,\$s*1024,1; \$s=0}; read ARGV,\$buf,1024; print \$buf}' 1<> $dev2"
 +
 +#Local version
 +#perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};print md5($_)' $dev2 | perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};$b=md5($_); read STDIN,$a,16;if ($a eq $b) {print "s"} else {print "c" . $_}' $dev1 | perl -ne 'BEGIN{$/=\1} if ($_ eq"s") {$s++} else {if ($s) { seek STDOUT,$s*1024,1; $s=0}; read ARGV,$buf,1024; print $buf}' 1<> $dev2
 +
 +</code>
 +
 +===== Modifier la valeur d'une variable dans un fichier exécutable (ELF) =====
 +
 +Installer les paquets nécessaires
 +<code>
 +apt install binutils hexedit
 +</code>
 +
 +Optionnel : lister les sections et les variables
 +<code>
 +readelf -a my_executable_elf_file | less
 +</code>
 +
 +Décompiler le fichier et rechercher la commande d'affectation de la variable
 +<code>
 +objdump -M intel -d my_executable_elf_file | less
 +#/ma_variable
 +</code>
 +Noter la chaîne hexadécimale correspondante
 +
 +Éditer le fichier en recherchant la chaîne
 +<code>
 +hexedit my_executable_elf_file
 +#CTRL+S hexstring
 +#CTRL+X save and exit
 +</code>
 +
 +===== Décaler uid et gid d'un fichier (shift uid and gid) =====
 +
 +<code bash>
 +#!/bin/bash
 +
 +#dir=/var/lib/lxc/gestion/rootfs/
 +dir=$1
 +range=$2
 +
 +declare -i uid
 +declare -i gid
 +declare -i newuid
 +declare -i newgid
 +
 +while IFS= read -r -d $'\0' f
 +do
 + #echo $f
 + read uid gid < <(ls -dn "$f" | awk '{print $3,$4}')
 + #echo "$uid:$gid"
 + newuid=$(( uid + range ))
 + newgid=$(( gid + range ))
 + #echo "$newuid:$newgid"
 + (( $uid < $range )) && { echo "$f" $newuid:$newgid; chown -h $newuid:$newgid "$f"; }
 + #ls -dn $f
 +done < <(find $dir -print0)
 +</code>
 +
 +===== Réencoder en utf8 un fichier texte mal encodé =====
 +
 +Lien : http://www.i18nqa.com/debug/utf8-debug.html
 +
 +<code bash>
 +sed -e 's/â/â/g' -e 's/Ã\xA0/à/g' -e 's/ê/ê/g' -e 's/ë/ë/g' -e 's/è/è/g' -e 's/é/é/g' -e 's/ï/ï/g' -e 's/ô/ô/g' -e 's/û/û/g' -e 's/ü/ü/g' -e 's/ç/ç/g' mon_fichier
 +</code>
 +
 +===== Activer un certificat SSL pour l'interface d'administration de ISPconfig3 =====
 +
 +cf : https://www.howtoforge.com/community/threads/get-ssl-certificate-for-ispconfig-admin-from-letsencrypt.73097/
 +<code bash>
 +/root/.local/share/letsencrypt/bin/letsencrypt auth --text --agree-tos --authenticator webroot --server https://acme-v01.api.letsencrypt.org/directory --rsa-key-size 4096 --email postmaster@`hostname -d` --domains `hostname -f` --webroot-path /usr/local/ispconfig/interface/acme
 +
 +dt=`date '+%Y%m%d%H%M%S'`
 +cd /usr/local/ispconfig/interface/ssl/
 +for ext in csr key.secure key crt; do if [ -f ispserver.$ext ]; then mv ispserver.$ext ispserver.$ext.old.$dt; fi; done
 +
 +ln -s /etc/letsencrypt/live/`hostname -f`/privkey.pem ispserver.key
 +ln -s /etc/letsencrypt/live/`hostname -f`/fullchain.pem ispserver.crt
 +
 +service apache2 restart
 +</code>
 +
 +===== Ajouter le support de php 5.6 dans une debian =====
 +
 +Lien
 +  * https://deb.sury.org/#debian-dpa
 +  * https://packages.sury.org/php/
 +
 +<code bash>
 +apt install apt-transport-https lsb-release ca-certificates
 +wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
 +echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
 +apt update
 +apt install php5.6 php5.6-curl php5.6-xml php5.6-mysql php5.6-mbstring php5.6-mcrypt php5.6-gd php5.6-json php5.6-intl php5.6-fpm php5.6-cli
 +</code>
 +
 +===== Redimensionner un disque virtuel et le faire rescanner par le système =====
 +
 +https://geekpeek.net/rescan-scsi-bus-on-linux-system/
 +
 +<code bash>
 +echo "1" > /sys/class/block/sdX/device/rescan
 +resize2fs /dev/sdX
 +</code>
 +
 +Avec LVM, en plus
 +
 +<code bash>
 +pvresize /dev/sdX
 +vgresize <volume>
 +lvresize -l +100%FREE <logical-volume>
 +</code>