Commandes shell

Écrit le 21 août 2015  •  Modifié le 00 mars 2018  •  Intervention délicate •  assez souvent :) •  Aucun commentaire

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

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 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 avec une date dans un interval 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

GREP

afficher les 5 lignes suivantes d'une chaine 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 chaine de caractères qui commence par une tabulation, ah!

$ grep "\<ctrl+v><tab>top: 13px;" global.css

MV, RENAME

renommer pluieurs fichiers en ajoutant un terme au nom initial

$ for i in `ls | cut -d. -f1`; do mv $i.jpg $i-small.jpg; done

renommer pluieurs fichiers en changeant l'extension

$ for i in `ls *.png | cut -d. -f1` ; do mv $i.png $i.jpg; done

renommer pluieurs 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 pluieurs fichiers avec seulement une partie du nom du fichier

$ rename 's/(.*)-{2}.*/$1/' *--*
renome les fichiers dont le nom contient le motif -- avec la chaine de caractères qui précède ce motif
par exemple toto-3.txt--12345DFG_ert sera renomé 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

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

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 specificationi
root ALL=(ALL:ALL) ALL
utilisateur 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 :

$ ssh-add

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 :

$ req -new -key fpw2.key -out fpw2.csr

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

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

$ fusermount -u ~/SSHFS/repertoire_distant

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

chercher et remplacer une chaine de caractères dans tous les fichiers du répertoire

$ perl -pi -e "s/<\/span>]]><\/champArt_temps>/min<\/span>]]><\/champArt_temps>/g" *

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 les caractères entre deux motifs des lignes contenant un motif

$ sed '/champArt_facilite/s/<span title="délicat.*span>//g' 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

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"'"

SYSTEM

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

$ udisksctl status

$ udisksctl info -b /dev/sdb

$ udisks --show-info /dev/sdb

$ sudo hdparm -B /dev/sdb

afficher la version de debian ;)

$ cat /etc/debian_version

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/ctrl+v ctrl+m//

Quelques adresses

Écrire un commentaire

Pour la vérification anti-spam, saisissez la deuxième lettre du mot "rssiih" dans le carré rouge ci-dessous :

  puis