Linux underground

Quelques exemples de scripts…

Ne pas oublier de vérifier que le fichier script à l'attribut "exécution" (chmod +x nomfich.sh) et  toujours commencer le script par :

#!/bin/bash
# Description de ce que fait le script

et l'exécuter par ./nomfich.sh

A noter que si toutes les commandes se trouvent sur une ligne, séparées par ";", on peut les encoder en ligne de commande.

Testez la version du noyau

#!/bin/sh

if [ `uname -r` == "4.14.100" ]
then
 <liste de commandes>
else
 <liste de commandes>
endif

Script contenant une fonction avec passage de paramètres

#!/bin/sh

print()
{
  for FILE in *; do
  echo "${FILE}"
  done
}

LIST="file01 file02 file03 file04"
print "${LIST}"

Exemples d'utilisation de awk

L'argument $0 affiche la totalité de la ligne :

$ echo part1 part2 part3 part4 | awk '{print $0}'

Affichera part1 part2 part3 part4

$ echo part1 part2 part3 part4 | awk '{print $2}'

Affichera part2

Faisons la même chose mais avec un séparateur choisi par l'utilisateur. Remarquez les "" et le caractère d'échappement (\) lorsqu'il s'agit d'un caractère réservé:

$ echo part1,part2,part3,part4 | awk -F, '{print $2}'
$ echo "part1;part2;part3;part4" | awk -F\; '{print $2}'


Un exemple concret où on affiche uniquement les noms d'utilisateurs du fichier /etc/passwd :

$ awk -F: '{print $1}' /etc/passwd

Changez les majuscules en minuscules dans les noms de fichier

$ for N in *; do mv ${N} `echo ${N} | tr '[:upper:]' '[:lower:]'`; done

Triez des dossiers par taille

$ du -sk /home/* | sort -n

Donnera la liste de tous les répertoires de /home/ triés par taille, du plus petit au plus gros. Remarquez que s'il y avait d'autres types de fichiers que des répertoires, ceux-ci seraient également listés.

Ajoutez la date dans un nom fichier

$ mv mon_fichier mon_fichier_`date +%Y-%m-%d`
$ mv mon_fichier mon_fichier_`date +%Y-%m-%dT%H:%M:%S`


Pour faire tous les fichiers d'un répertoire :

#!/bin/sh

NOW=`date +%Y-%m-%d`
for FILE in *; do
mv "${FILE}" "${FILE}_${NOW}"
done

Coupez la fin d'un chaîne de caractères

Dans l'exemple ci-dessous, on va remplacer l'extension des fichiers par une autres
$ for FILE in *txt; do echo "${FILE}" "${FILE%*txt}bak"; done
$ for FILE in *wav; do echo "${FILE}" "${FILE%*wav}mp3"; done


Ce qui se trouve après "*" est coupé. Remplacez echo par la commande que vous souhaitez (cp, mv, convert, …).

Remplacez un morceau d'une chaîne de caractères

Cet exemple-ci fait quelque chose de semblable à celui ci-dessus : #!/bin/sh

for fichier in *.JPG
do
  minus=`echo "${fichier}" | sed -e 's/JPG$/jpg/'`
  mv "${fichier}" "${minus}"
done


Mais l'utilisation de sed permet de remplacer n'importe quel morceau déterminé de la chaîne de caractères.

#!/bin/sh

for fichier in DSC*.jpg
do
  modi=`echo "${fichier}" | sed -e 's/DSC\(.*\)\.jpg/Photo \1.jpg/'`
  mv "${fichier}" "${modi}"
done


Dans sed, \1 est remplacé par ce qui est entre \( et \).

Renommez une liste de fichiers de manière incrémentale

$ CPT=1; for FILE in *; do mv "${FILE}" "préfixe_${CPT}.jpg"; ((CPT+=1)); done

Récupérer l'adresse IP

IP interne

Un simple
$ ifconfig
vous permettra de connaître le nom de votre interface réseau. Chez moi, c'est enp0s10.

IP_PRIV4="`ifconfig enp0s10 | grep 'inet ' | awk '{print $2}'`"
IP_PRIV6="`ifconfig enp0s10 | grep 'inet6 fe80' | awk '{print $2}'`"

IP publique derrière un routeur (source www.labo-linux.org)

IP_PUBLIC=$(/usr/bin/wget -q https://www.monip.org/ -O- \
| /bin/grep 'IP :' | /usr/bin/cut --characters=-80 \
| /bin/sed -e 's/^.* \(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*$/\1/')


Contact