Commandes shell
Les commandes "shell", ou "lignes de commandes" permettent de demander à un ordinateur et/ou à un serveur d'exécuter des opérations. Voici un exemple de commande shell pour trouver à partir du répertoire courant les fichiers de plus de 10Mo et pour les classer du plus petit au plus grand :
$ find . -size +10M -print0 | xargs -0 ls -al | awk '{print $5 " " $9}' | sort -n
une autre façon :
$ find . -size +10M -print0 | xargs -0 ls -al | cut -c28-300 | sort -n
Cette article collectionne des commandes utilisées plus ou moins fréquemment et parfois longues à mettre au point.
▼ Sommaire des commandes
- CRON + WGET
- DATE
- FIND + XARGS
- GNUPG
- GREP
- IMAGES
- MV et RENAME
- MYSQL
- OCC
- RSYNC
- RESEAU
- SECURITE
- SED, GREP, AWK, PERL, COLUMN
- SSH
- SYSTEM & HARDWARE
- VIDEO
- VIM
- Quelques adresses
▲CRON, WGET
lancer une tâche WGET récurrente et ignorer les résultats et les erreurs
$ crontab -e
## tâche quotidienne pour mise à jour des commandes et des étiquettes
30 4 * * * wget -O /dev/null -o /dev/null -q https://www.boutique.fr/modules/mondialrelay/cron.php?secure_key=xxxxxxx
▲DATE
Convertir une date en timestamp temps unix
$ date -d"2023/09/08 07:32:34" "+%s"
▲FIND, XARGS
supprimer des fichiers modifiés il y a plus de 5 x 24h
$ find ~/bli/ble/ -mtime +5 -name "*.bz2" -print -exec rm -fR {} +
$ find ~/bla/blo/ -mtime +5 -print -exec rm -fR {} +
trouver les fichiers de plus de 10Mo les classer du plus petit au plus grand et calculer le poids total des 10Mo+
$ find . -size +10M -print0 | xargs -0 ls -al | awk '{print $5 " " $9}' | sort -n
ou :
$ find . -size +10M -print0 | xargs -0 ls -al | cut -c28-300 | sort -n
$ find . -size +10M -print0 | xargs -0 ls -al | awk '{print $5}' > toto ; paste -sd+ toto | bc
$ find . -size +10M -print0 | xargs -0 ls -l * | awk '{s+=$5} END {print s}'
trouver les fichiers qui ne contiennent pas une chaîne de caractères
$ find . -name '*.xml' -type f '!' -exec grep -q 'chaine_de_caractere' {} ; -print
lister uniquement les répertoires cachés dans le répertoire courant
$ find . -maxdepth 1 -type d | grep ./.
trouver les sous-sous-répertoires, sauf certains, les classer, les compter
$ find . -mindepth 2 -maxdepth 2 -type d | grep -v "archives|dl|protec|ok0*" | sort | wc -l
trouver les fichiers (pas les répertoires) dont le propriétaire ou le groupe ou les autres sont exécutables
$ find . -type f -perm /u+x,g+x,o+x
régler les permissions à 644 pour tous les fichiers (sauf les répertoires)
$ find . -type f -exec chmod 644 {} +
trouver les fichiers avec une date dans un intervalle de dates
$ find -newerct "1 Aug 2013" ! -newerct "1 Sep 2013" -ls
où :
- -newer and any of a, B, c, m, t, for looking at atime/birth/ctime/mtime/time
utiliser les arguments par deux
$ echo 1 2 3 4 | xargs -n 2
1 2
3 4
supprimer les fichiers .bak dans le répertoire courant
$ find . -name "*.bak" -type f -print | xargs /bin/rm -f
copier dans le répertoire courant les fichiers .php venant du premier sous répertoire de plusieurs répertoires
$ find ~/backup/201*/toto.com/htdocs/ -maxdepth 1 -type f -name "*.php" -print0 | xargs -0 -I {} cp {} .
trouver et déplacer les fichiers .bak du répertoire courant vers un autre répertoire
$ find . -name "*.bak" -print0 | xargs -0 -I {} mv {} ~/old.files
où :
- -0 (zéro) If there are blank spaces or characters (including newlines) many commands will not work. This option take cares of file names with blank space.
- -I (i majuscule) Replace occurrences of replace-str in the initial-arguments with names read from standard input. Also, unquoted blanks do not terminate input items; instead the separator is the newline character.
▲GNUPG
changer la passphrase
$ gpg --edit-key [keyID]
Command> passwd
Enter passphrase:
Repeat passphrase:
Command> save
importer une clé publique
$ gpg --import 348c8651206633fd983a8fc4deacea00075e1d76.asc ou .sig
vérifier un fichier avec sa clé publique
$ gpg --import 348c8651206633fd983a8fc4deacea00075e1d76.asc
$ gpg --verify neon-user-20240704-0716.iso.sig neon-user-20240704-0716.iso
voir aussi : https://support.torproject.org/tbb/how-to-verify-signature/
▲GREP
afficher les 5 lignes suivantes d'une chaîne de caractères dans tous les fichiers du répertoire
$ grep -A5 "<script src="http://www.google-analytics.com/urchin.js"" *
chercher dans un fichier une chaîne de caractères qui commence par une tabulation, ah!
$ grep "<ctrl+v><tab>top: 13px;" global.css
▲IMAGES
réduire de moitié la taille des images d'un répertoire et les sauvegarder dans un sous-répertoire
$ mogrify -path resized/ -resize 50% -quality 90 *.jpg
▲MV, RENAME
renommer plusieurs fichiers en ajoutant un terme au nom initial
$ for i in `ls | cut -d. -f1`; do mv $i.jpg $i-small.jpg; done
renommer plusieurs fichiers en changeant l'extension
$ for i in `ls *.png | cut -d. -f1` ; do mv $i.png $i.jpg; done
renommer plusieurs fichiers avec un nouveau nom incrémenté
$ j=0; for i in *.jpg; do let j+=1; mv "$i" "nom_incremente$j.jpg"; done
renommer tous les fichiers en remplaçant les espaces " " par des tiret bas "_"
$ for i in * *; do mv "$i" "${i// /_}"; done
renommer récursivement tous les fichiers en remplaçant les espaces " " par des tiret bas "_"
$ find . -type f -name "* *" -print0 | perl -n0e '$old = $_; s/ /_/g; rename $old, $_'
renommer plusieurs fichiers avec seulement une partie du nom du fichier
$ rename 's/(.*)-{2}.*/$1/' *--*
renomme les fichiers dont le nom contient le motif -- avec la chaîne de caractères qui précède ce motif
par exemple toto-3.txt--12345DFG_ert sera renommé en toto-3.txt
▲MYSQL
dump
$ mysqldump -uutilisateur_base -pmot_de_passe_utilisateur -hserveur_mysql nom_base > nom_fichier.sql
$ mysqldump --host=serveur_mysql --user=utilisateur_base --password='mot_de_passe_tordu_utilisateur' nom_base > nom_fichier.sql
drop all tables
$ mysql --silent --skip-column-names -hserveur_mysql -uutilisateur_base -p'mot_de_passe_tordu_utilisateur' nom_base -e "show tables" | gawk '{print "drop table " $1 ";"}' | mysql -hserveur_mysql -uutilisateur_base -p'mot_de_passe_tordu_utilisateur' nom_base
load
$ zcat dumpedbase.sql.gz | mysql -uutilisateur_base -p'mot_de_passe_tordu_utilisateur' -hserveur_mysql nom_base
changer le mot de passe de la base
$ mysql -h cl1-sql13 -u p5459_1 -p
Enter password:
mysql> SET password FOR "p5459_1" = password('dAg=G3/kj>FR-6_s*q8e');
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Bye
▲OCC
status de l'instance OwnCloud
$ ./occ status
scanner les nouveaux fichiers et mettre à jour le cache
$ ./occ files:scan
mode maintenance
$ ./occ maintenance:mode --on
supprimer les fichiers poubellelisés
$ ./occ trashbin:cleanup
mise à jour de l'instance OwnCloud
$ ./occ upgrade
réduire la taille d'un pdf
$ gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=$resultat.pdf source.pdf
convertir un pdf en jpg
$ gs -dNOPAUSE -sDEVICE=jpeg -sOutputFile=image.jpg -dJPEGQ=75 -r500 -q fichier.pdf -c quit
rassembler 2 ou plusieurs pdf
$ pdftk pdf1.pdf pdf2.pdf cat output resultat.pdf
$ pdftk *.pdf cat output resultat.pdf
$ pdfunite abc.pdf def.pdf ijk.pf resultat.pdf
supprimer la page 2 dans un pdf de 3 pages
$ pdftk pdf1.pdf cat 1 3 output resultat.pdf
$ pdftk pdf1.pdf cat ~2 output resultat.pdf
$ pdfseparate -f 1 -l 1 abc.pdf abc1.pdf ; pdfseparate -f 3 -l 3 abc.pdf abc3.pdf ; pdfunite abc1.pdf abc3.pdf abc13.pdf
▲RSYNC
synchroniser deux répertoires
$ rsync -avz /home/johndoe /media/t64_backup/home
synchroniser plusieurs répertoires et pas tous les sous-répertoires
$ /usr/bin/rsync -az --stats --delete --delete-excluded --filter=". $FILTER" $SOURCE $DESTINATION 1>> $RSYNCLOG
$ cat filter.txt
+ /.cache/
+ /.cache/evolution/***
- /.cache/*
- /.config/chromium/
- /.thumbnails/
- /SSHfs/
synchroniser certains répertoires, en exclure certains fichiers, et backup des fichiers modifiés
$ /usr/bin/rsync -abrz --stats --delete --delete-excluded --exclude-from=$EXCLUDE --files-from=$FILESFROM --backup-dir=$BACKUPDIR --suffix=$SUFFIX $SOURCE $DESTINATION 1>> $RSYNCLOG
$ cat filesfrom.txt
bin
Documents/p>
$ cat exclude.txt
bin/*.log
bin/*.tmp
▲RESEAU
checker la configuration / l'état du réseau local
$ networkctl status
$ routel
$ nmcli dev show
checker un nom de domaine / un site web
$ host -a domaine.tld
$ traceroute domaine.tld
▲SECURITE
exécuter une commande bash sans qu'elle se retrouve dans l'historique
$ HISTFILE= ; ma_commande
ajouter un utilisateur au sudoers
# visudo
# User privilege specification
root ALL=(ALL:ALL) ALL
générer une clé SSH pour une utilisation interactive
pour l'ouverture d'un shell complet, donc on met une passphrase! :
$ ssh-keygen -t rsa -b 4096
pour ouvrir la clé le matin :
générer une clé SSL pour un vhost apache ssl
d'abord on génère la clé openssl :
$ openssl genrsa -out fpw2.key 2048
puis on génère le csr qu'on récupère pour aller générer un certificat chez un fournisseur :
htaccess : forcer https
# BEGIN Redirect to https
<ifmodule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</ifmodule>
# END Redirect to https
htaccess : restriction d'accès par mot de passe
# BEGIN -- Restriction d'accès
AuthUserFile /le_repertoire/ou_on_trouve/le_fichier/avec_les_mots_de_passe/.htpasswd
AuthName "Zone protegee"
AuthType Basic Require valid-user
# END -- Restriction d'accès
$ htpasswd -c /le_repertoire/ou_on_trouve/le_fichier/avec_les_mots_de_passe/.htpasswd identifiant
$ chmod 750 /le_repertoire/ou_on_trouve/le_fichier/avec_les_mots_de_passe
regénérer le certificat snakeoil de debian
$ make-ssl-cert generate-default-snakeoil --force-overwrite
whatzat ??
$ mkdir -p /etc/ssl/localcerts
$ cd /etc/ssl/localcerts
$ openssl req -new -x509 -days 365 -nodes -out apache.pem -keyout apache.key
$ chmod 600 apache*
Short Tip: Convert PEM files to CRT/DER
$ openssl x509 -outform der -in MyCertificate.pem -out MyCertificate.crt
générer un mot de passe aléatoire
sous mac osx :
$ head /dev/urandom | uuencode -m - | sed -n 2p | cut -c1-20;
$ LC_ALL=C head /dev/urandom | LC_ALL=C tr -cd "[:print:]" | head -c20 ; echo 'n'
sous gnu linux :
$ head /dev/urandom | tr -dc !-?-A-Z-a-z-0-9 | head -c50
$ head /dev/urandom | tr -dc A-Z-a-z-0-9 | head -c20
$ mkpasswd toto $foo
▲SED, GREP, AWK, PERL, COLUMN
compter un caractere (ici: i)
$ var=`cat in.txt` ; var="${var//[^i]/}" ; echo ${#var}
remplacer plusieurs caractères d'une ligne par une chaîne de caractères
$ echo "azerty" | sed "s/a|z|y/OO/g"
chercher et remplacer une chaine de caractères dans un ou plusieurs fichiers
$ perl -pi -e sed s/chaine1/chaine2/g fichier1
trouver un bloc de texte
$ sed -i".bak" '/<!-- DEBUT/,/<!-- FIN/d' *.htm
supprimer la ligne contenant la chaîne "awk"
$ sed '/awk/d' fichier.txt
supprimer une ligne contenant un pattern + les 5 lignes suivantes en backupant les fichiers
$ sed -s -i.bak '/<script src="http:/,+5d' index.php
supprimer la 3ème ligne
$ sed '3d' fichier.txt
supprimer la dernière ligne
$ sed '$d' fichier.txt
supprimer toutes les lignes vides
$ sed '/^$/d' fichier.txt
$ sed '/./!d' fichier.txt
supprimer des lignes grâce à une expression régulière
ici on élimine celles contenant des caractères numériques (au moins 1 chiffre) situés en fin de ligne :
$ sed '/[0-9/][0-9]*$/d' fichier.txt
supprimer l'intervalle compris entre les lignes 7 et 9
$ sed '7,9d' fichier.txt
la même chose mais en remplaçant l'adresse par des "motifs"
$ sed '/-Début/,/-Fin/d' fichier.txt
remplacer une chaîne de caractères dans tous les fichiers du répertoire et des sous-répertoires
$ find . -type f -exec sed -i 's/A remplacer/Par ça/g' {} +
classer les lignes d'un fichier sur le premier mot après un motif
$ for i in `cat quelquesadresses.txt | awk -F "">" '{print $2}' | sort awk '{print $1}'`; do grep "$i" quelquesadresses.txt ; done
totaliser la taille des fichiers listés
$ ls -l *.xcf | awk '{s+=$5} END {print s}'
$ expr `stat -c'%s +' *.xcf` 0
afficher le contenu d'un fichier sous frome de colonne
$ cat bin/foo.txt | awk -F "'" '{print $1 "t" $2 "t" $3 "t" $4 "t" $5 }'
$ cat bin/foo.txt | column -t -s"'"
▲SSH
monter/démonter un répertoire distant avec sshfs
$ apt-get install sshfs
$ mkdir -p SSHFS/repertoire_distant
$ sshfs login@hebergeur.com: ~/SSHFS/repertoire_distant
$ sudo sshfs -o allow_other,IdentityFile=/home/franck/.ssh/id_rsa -p5022 hosteduser@hosting.com:/home/hosteduser/public_html /home/franck/atelier/html
$ fusermount -u ~/SSHFS/repertoire_distant
▲SYSTEM & HARDWARE
afficher l'utilisation de la RAM en temps réel
$ watch -n 1 free -m
$ watch -n 1 cat /proc/meminfo
purger la RAM non utilisée
$ sudo sysctl -w vm.drop_caches=3
$ sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
lister le matériel
$ sudo dmidecode
$ sudo dmidecode -t memory
$ lspci
$ lscpu
$ lsusb -v
afficher des infos sur une partition ou sur un disque
$ fdisk -l
$ ls -l /dev/disk/by-id/
$ lsblk
$ lsblk -o MODEL,SERIAL,SIZE,STATE --nodeps
$ udisksctl status
$ udisksctl info -b /dev/sdb
$ udisks --show-info /dev/sdb
$ sudo hdparm -B /dev/sdb
monter en lecture écriture une partition hfsplus
$ /dev/sdc1 on /media/franck/GUYMAC type hfsplus (ro,nosuid,nodev,relatime,umask=22,uid=1000,gid=1000,nls=utf8,uhelper=udisks2)
$ sudo mount -t hfsplus -o remount,force,rw /media/franck/GUYMAC
monter en lecture écriture une partition xfs avec un UUID dupliqué (cas d'un disque externe cloné)
$ sudo mkdir /media/franck/sdb5
$ sudo mount -o nouuid /dev/sdb5 /media/franck/sdb5
lister le poids en kilo octets des sous répertoires cachés et les classer par ordre croissant de poids
$ du -hsk .[^.]* | sort -n
afficher la version de debian ;)
$ cat /etc/debian_version
$ cat /etc/os-release
$ lsb_release -a
▲VIDEO
transcoder du mp4 en ogv, mov ou flv
$ ffmpeg -i xxx.mp4 -acodec libvorbis -vcodec libtheora -f ogg -b 4096k -ab 256k xxx.ogv
$ avconv -i xxx.mp4 -acodec copy -vcodec copy -f mov yyy.mov
$ avconv -i xxx.mp4 -s 640x360 -ar 44100 -pass 1 -b 1024k -r 24 -ab 128 -f flv -y yyy.flv
▲VIM
remplacer des caractères dans tout le fichier
:%s/chaine1/chaine2/g
remplacer les tabulations par un espace dans tout le fichier
1,$s/t/ /g
supprimer les ^M dans tout le fichier
:%s/[touches CTRL+V][touches CTRL+M]//
▲Quelques adresses
- corporesano.org : grep - awk - sed
- Eric Kranich : Scripts
- Funix : Cours utilisateur UNIX
- Guide avancé d'écriture des scripts Bash
- Linux Attitude : Scripting
- pdftk pour modifier les pdf
- REX EGG : Rex Eats Regular Expressions for Breakfast
- Utiles pour SED
- Wikilivres : Le système d'exploitation GNU-Linux