Raccourcis claviers, options de commandes diverses, etc… Des choses que je ne veux pas oublier, ou qui pourraient m'être utiles un jour.
-
Insérer un caractère tel que ñ ou un espace insécable (non-breaking space)
Pour ñ :
- appuyer sur la touche de composition (dans XFCE, Paramètres > Clavier > Disposition > Touche composée)
- puis saisir ~
- suivi de n
Pour un espace insécable :
- appuyer sur la touche de composition
- puis saisir un espace
- suivi d'un deuxième espace
Pour un tiret long — :
- appuyer sur la touche de composition
- puis saisir trois tirets
Pour le caractère points de suspension … :
- appuyer sur la touche de composition
- puis saisir deux points
Pour le point médian, c'est plus simple : Alt Gr + :
Dans Vim, on peut aussi insérer certains caractères avec Ctrl-k, par exemple pour ñ : Ctrl-k ~ n
-
Faire une archive tar en excluant un répertoire et son contenu :
tar --exclude=./répertoire
--exclude=./répertoire/ n'exclut que le répertoire, pas son contenu, et --exclude=./répertoire/* n'exclut que son contenu. On se fait facilement avoir à cause de l'auto-complétion de Bash qui ajoute le slash aux répertoires.
Autre piège : --exclude=répertoire exclut ./répertoire mais aussi ./foobar/répertoire
-
Faire un tar de moins de 4 Go (4294967295 octets maximum) pour mettre sur un disque ou une clé USB FAT32 :
tar cvzf - répertoire/ | split -b 4294967295 - bidule.tgz.
va produire des fichiers bidule.tgz.aa, bidule.tgz.ab, etc. qu'on va détarer par cat bidule.tgz.* | tar xvzf -
-
Copier un répertoire sur un serveur distant avec rsync :
rsync -av répertoire_local/ utilisateur@serveur:répertoire_distant
Piège ! Ne pas oublier le / final du répertoire local, sinon ça crée répertoire_distant/répertoire_local sur le serveur
-
Trouver les fichiers qui matchent [0-9]+.jpg dans plein de sous-répertoires, par exemple
img/p/9/8/5/985.jpg
: find img/p/ -regex ".*/[0-9]+.jpg"
Le piège c'est qu'il faut .*/ sinon ça ne matche pas, find ajoute ^ et $ automatiquement à la regexp
-
Trouver les fichiers dans lesquels le groupe ne peut pas écrire, sauf dans un certain répertoire :
find . -path ./.git -prune -or -not -perm -020 -ls
-
Quand un fichier (ou un répertoire) a une permission avec un S majuscule, ça veut dire que le bit setuid (ou setgid) est positionné mais il manque la permission d'exécuter le fichier (ou la permission d'entrer dans le répertoire).
Pour régler le problème, il suffit de faire chmod u+x fichier
ou chmod g+x répertoire
ou bien retirer le bit setuid/setgid par chmod u-s fichier
ou chmod g-s répertoire
-
Trier la sortie de find sur la taille des fichiers :
find . -type f -ls | sort -b -n -k 7
-b pour ignorer les espaces
-n pour trier numériquement
-
Idem avec la taille des fichiers lisible pour un humain :
Version lente si beaucoup de fichiers : find . -type f -exec ls -lh {} \; | sort -b -h -k 5
Version rapide si beaucoup de fichiers : find . -type f -print0 | xargs -0 ls -lh | sort -b -h -k 5
-
Demander une confirmation à chaque -exec de la commande find
(ça vaut mieux pour un programme tel que gvimdiff !)
find . -type f -ok gvimdiff {} ../ailleurs/{} \;
-
Fermer une connexion SSH gelée (en sortie de veille du PC, classiquement) : Entrée puis ~ puis .
-
Copier des fichiers depuis ou vers une machine A accessible seulement à travers une machine B :
On peut imaginer par exemple que A n'a pas d'adresse publique.
- Établir un tunnel SSH sur B :
ssh -L 12345:A:22 moi@B
(garder ce shell ouvert ou bien ajouter -f -N
)
- Copier depuis A :
scp -P 12345 moi@localhost:/chemin/du/fichier/sur/A /chemin/en/réception
-
Copier vers A :
scp -P 12345 /chemin/du/fichier/local moi@localhost:/chemin/du/fichier/sur/A
moi@localhost est en réalité moi@A donc il faut taper le mot de passe sur A, pas sur localhost 😉
-
Faire passer les connexions de Firefox par une machine avec SSH :
ssh -D 43210 -f -C -q -N moi@monserveur
puis dans about:preferences
Préférences réseau : Configuration manuelle, Hôte SOCKS localhost
Port 43210
-
Faire passer les connexions vers un port spécifique par une autre interface, par exemple un smartphone 4G connecté en modem USB :
- Déclarer une nouvelle table de routage :
echo "2 ma-route" >> /etc/iproute2/rt_tables
(pas besoin de le faire à chaque fois, évidemment)
- Prendre l'IP de passerelle de l'interface usb0 et la coller dans cette commande :
ip route add default via 192.168.xxx.yyy dev usb0 table ma-route
- Demander au noyau de faire passer le port 443 (par exemple) par cette route :
ip rule add iif lo ipproto tcp dport 443 lookup ma-route
- Pour arrêter de passer par là :
ip rule del iif lo ipproto tcp dport 443 lookup ma-route
-
Copier un fichier en local avec une barre de progression (cp ne peut pas le faire) :
rsync --progress fichier1 fichier2
-
Ajouter un groupe à un utilisateur en ligne de commande :
sudo usermod -a -G nom_du_groupe nom_utilisateur
(ne surtout pas oublier ce -a sinon on se retrouve avec un seul group) (ça m'est arrivé trop souvent 😂)
-
Avoir un raccourci
ssh foo
au lieu de taper ssh nom_super_long@nom_de_la_machine
, ajouter dans .ssh/config :
Host foo
HostName nom_de_la_machine
# éventuellement : Port 12345
User nom_super_long
-
Vérifier l'empreinte (fingerprint) d'un serveur :
SSH : ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
Web : openssl x509 -noout -in /etc/pki/tls/certs/foobar.crt -fingerprint -sha1
(exemple sur un serveur CentOS)
-
Se connecter à hostB en VNC à travers SSH :
userA@hostA:~$ ssh -L 5900:localhost:5900 userB@hostB
userB@hostB:~$ x11vnc
(c'est tout, pas besoin de mot de passe VNC)
userA@hostA:~$ vinagre localhost
- quand on ferme la fenêtre VNC (Vinagre), le serveur x11vnc de hostB se termine donc pas de serveur qui traine 👍
-
Assigner une adresse IP temporaire à la carte Ethernet :
sudo ip addr add 192.168.1.2/24 dev enp34s0
(pour trouver le nom de l'interface : ip addr
tout simplement)
Pour retirer : sudo ip addr del 192.168.1.2/24 dev enp34s0
-
Scroller dans screen :
Ctrl-a Esc
(entre dans le mode copie) puis Esc
(pour sortir du mode copie).
-
Faire un grep récursif uniquement dans certains fichiers, par exemple .php :
grep -r foobar --exclude=* --include=*.php le/chemin/
-
Lire le résultat d'un grep en couleur dans less :
grep --color=always "aiguille" botte_de_foin.foo | less -R
C'est à grep qu'il faut dire d'envoyer de la couleur même si la sortie n'est pas dirigée vers un terminal.
Et il faut dire à less d'afficher les caractères bruts sinon il supprime les codes de couleurs.
-
Copier la sortie d'une commande en couleur (comme ls, grep, tree, colordiff, etc.) :
ls --color=always | aha > /tmp/ls.html
. On peut ensuite ouvrir le fichier HTML dans Firefox, le copier dans Thunderbird, etc. (sudo apt-get install aha
)
-
Enregistrer tout ce qu'on fait dans un terminal :
script
puis pour terminer : exit
(Ctrl-d). S'enchaîne très bien avec cat typescript | aha > /tmp/typescript.html
.
-
Savoir si on est en train d'enregistrer :
pstree -ah $PPID
On verra le cas échéant :
script
└─bash -i
└─pstree -ah 12345
-
Additionner la RAM de tous les processus apache2 :
ps -C apache2 -o rss | awk '{ t += $1 } END { print "TOTAL : " t }'
ou plus simple : smem -t -P apache2
et plus pratique : smem -t -P dovecot
(matche dovecot, dovecot/imap, dovecot/imap-login, etc...)
-
Afficher un fichier comme avec la commande cat, mais avec la coloration syntaxique de Vim : Vimcat.
-
Faire un diff en mot à mot, et en couleur :
wdiff fichierA fichierB | colordiff
-
Convertir l'indentation par tabulations en 4 espaces :
expand -i -t 4 fichier > fichier2
-
Afficher toutes les lignes d'un fichier, CSV par exemple, sauf la première :
tail -n +2 fichier
ou sed '1d' fichier
-
Afficher la ligne 12345 d'un fichier :
tail -n +12345 fichier | head -1
ou sed -n '12345p' fichier
-
Inverser deux arguments de la ligne de commande Bash :
Alt-t
-
Déplacer un ou des arguments dans la dernière commande de shell Bash :
Ctrl-w
pour couper (autant que nécessaire) puis Ctrl-y
pour coller
-
Modifier la ligne de commande Bash courante dans Vim :
Ctrl-x Ctrl-e
-
Plus généralement, modifier la ligne de commande précédente :
fc
-
Où vont les mails quand Postfix est arrêté ? dans
/var/spool/postfix/maildrop/
(et la commande mailq
ne fonctionne pas)
-
Supprimer un mail bloqué dans la mailq de Postfix :
sudo postsuper -d AE0E010AE83
(où AE0E010AE83 est le Queue ID du mail affiché par la commande mailq
)
-
Lire un mail bloqué dans la mailq de Postfix :
sudo postcat -q AE0E010AE83
(où AE0E010AE83 est le Queue ID du mail affiché par la commande mailq
)
-
Lire un mail bloqué dans la mailq d'Exim :
sudo exim -Mvc 1ZIBTU-0006cB-Q3
(où 1ZIBTU-0006cB-Q3 est le Queue ID du mail affiché par la commande mailq
)
-
Afficher un log jusqu'à un évènement précis :
tail -f /var/log/apache2/access.log | sed -n '/11:08/q;p'
(exemple simpliste)
-
Afficher une notification quand il y a du nouveau dans un fichier de log :
f=/var/log/apache2/error.log ; while inotifywait -e modify $f ; do notify-send -t 2000 "Erreur" "dans $f" ; done
-
L'option format de la commande seq utilise un g et non un d comme printf :
seq -f '%02g' 31
affiche de 01 à 31
-
Instruction "no op" en Bash :
: Coucou ; echo "foobar"
. Utile par exemple dans une ligne de crontab, pour avoir "Coucou" dans le sujet du mail sans avoir à faire echo "foobar" | mail -s "Coucou" untel
.
-
Lire une liste contenue dans un fichier, en Bash, par exemple une liste à deux colonnes "date nom" :
cat fichier | while read date nom ; do echo "$nom --> $date" ; done
-
Idem pour une liste à deux colonnes séparées par virgule "date,nom" :
IFS=, cat fichier | while read date nom ; do echo "$nom --> $date" ; done
-
Raccourci pour
cp /foo/bar/baz /foo/bar/baz.BAK
: cp /foo/bar/baz{,.BAK}
-
Récupérer des fichiers effacés d'une carte SD : sudo photorec /dev/mmcblk0p1
-
Monter et récupérer les dernières photos d'un smartphone Android en ligne de commande plutôt que par l'interface graphique :
- Brancher le câble USB
- Accepter le transfert de fichiers sur le smartphone
- Trouver la valeur activation_root correspondante dans
gvfs-mount -li
par exemple mtp://[usb:002,008]/
ou faire gvfs-mount -o
puis gvfs-mount -li | sed -n '/Android Phone/,/activation_root=/p' | tail -1
gvfs-mount mtp://[usb:002,008]/
pour monter
rsync --dry-run --checksum -av $XDG_RUNTIME_DIR/gvfs/mtp\:host=%5Busb%3A002%2C008%5D/Mémoire\ de\ stockage\ interne/DCIM/100MEDIA/ ~/Photos/
Notes :
- $XDG_RUNTIME_DIR contient obligatoirement le bon répertoire sur un Linux récent
- Utiliser l'auto-complétion (tab) après mtp pour ne pas avoir à encoder ce qui suit
- --dry-run = vérification à blanc
- C'est très lent dès qu'on a plusieurs centaines de photos
- --checksum si gvfs ne préserve pas les dates (sur de vieilles versions d'Ubuntu), mais c'est encore plus lent
- Si tout semble OK, relancer la même commande sans --dry-run
gvfs-mount -u mtp://[usb:002,008]/
pour démonter
-
Supprimer une page d'un document PDF, par exemple la page 2 :
pdftk entrée.pdf cat 1 3-end output sortie.pdf
-
Savoir quel programme consomme quelle bande passante :
sudo nethogs
-
Limiter simplement la bande passante réseau consommée par un programme :
trickle -s -u 10 -d 10 firefox
pour 10 Ko/s en upload et en download (il y a aussi trickled, un démon pour limiter automatiquement tous les programmes)
-
Limiter simplement la bande passante réseau consommée par la machine globalement (par exemple parce qu'elle utilise la connexion d'un smartphone avec un forfait limité) :
sudo wondershaper wlan0 1000 200
pour ~ 1 Mo/s en réception, 200 Ko/s en émission, sur interface Wi-Fi (trouvé sur SO)
-
Vider le cache mémoire de Linux :
free && sudo sync && sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches' && free
(adapté de unix.stackexchange.com/a/87909)
-
Afficher la différence entre un fichier de conf et la version originale du paquet, par exemple vsftpd :
mkdir /tmp/ORIG
cd /tmp/ORIG/
apt download vsftpd
dpkg-deb -X vsftpd_3.0.3-3ubuntu2_amd64.deb .
diff etc/vsftpd.conf /etc/vsftpd.conf
-
Lancer Thunderbird et placer sa fenêtre au bon endroit sur XFCE (je ne sais pas pourquoi Thunderbird se place toujours en haut à gauche et ne mémorise pas sa dernière position comme Firefox) :
#!/bin/bash
thunderbird &
sleep 1
wmctrl -r Thunderbird -e 0,776,1,-1,-1
-
Ne rien afficher sur le "Bureau" de XFCE, parce que j'aime avoir un fond d'écran propre et parce que ce dossier ~/Bureau finit toujours par être un dépotoir : dans les réglages de XFCE, Bureau, onglet Icônes, Type d'icônes : Aucun.
-
Prendre des captures d'écran dans XFCE et ouvrir la capture automatiquement dans GIMP en version Snap (valable en 2020 en attendant cette solution) : lancer ce script via le raccourci clavier Impr écran dans les réglages de XFCE
#!/bin/bash
FILE=/home/herve/tmp/capture-$( date +%Y-%m-%d_%X ).png
xfce4-screenshooter --fullscreen --save $FILE
gimp $FILE
-
Lister les polices de caractères installées :
fc-list
-
Installer une police de caractères (ou seulement une «fonte», pourquoi pas) :
sudo cp bidule*.ttf /usr/share/fonts/
puis fc-cache -fv
(-f pour --force et -v pour --verbose). C'est devenu trop facile, Linux 😏