Commandes shell

Publié le - Modifié le 02 octobre 2023 | Aucun commentaire

Classé dans : Astuce, Outillage, Intervention délicate assez souvent :) | Mots clés : shell, Unix, GNU/Linux, Mac OS X

Les commandes "shell", ou "lignes de commandes" permettent de demander à un ordinateur et/ou à un serveur d'executer 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

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

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

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

PDF

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

$ lspci

$ lscpu

$ sudo dmidecode

$ lsusb -v

afficher des infos sur une partition ou sur un disque

$ lsblk

$ fdisk -l

$ 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

Source :

Écrire un commentaire

Quelle est le deuxième caractère du mot 8ujhcfl ?

Fil RSS des commentaires de cet article