wiki/TipsShell.md
pdiogoantunes cedbfa8e7c typo foor
2017-04-05 15:58:47 +02:00

5.1 KiB

Astuces SHell

Script

Style guide : https://google.github.io/styleguide/shell.xml

Configuration

Initialisation du shell

Entre les 3 modes ("login", "interactive non-login" et "non-interactive non-login") il y a de quoi se perdre à propos des fichiers chargés. Voici un rappel assez complet : https://github.com/rbenv/rbenv/wiki/Unix-shell-initialization

History Bash

bashrc :

export HISTCONTROL=$HISTCONTROL${HISTCONTROL+,}ignoreboth
export HISTSIZE=65535
export HISTTIMEFORMAT="%c : " 

Note

: si besoin on peut chattr +a /root/.bash_history pour empêcher sa suppression

Changer l'éditeur de texte par défaut pour une commande

Normalement le script (vipw, vigr, -ldapvi, ...) se réfère aux fichiers scripts (qui ne sont que des liens vers les binaires) :

/etc/alternatives/

Sinon en ligne de commande :

$ EDITOR=nano vipw

Manipulations

Tâches de fond

$ bg = "mettre en arrière plan"
$ fg = "mettre en premier plan"
$ jobs = "lister les tâches de fond"
%% = "dernier job utilisé (représenté par un +)"
%x = "job numéro x"
$ vi foo
^Z
[1]+  Stopped                 vi foo
$ tail -f bar
...
^C
$ fg
^Z
[1]+  Stopped                 vi foo
$ kill -9 %%

[1]+  Killed                 vi foo
$ ( sleep 1m; echo "Premier !" ) &
[1] 13649
$ ( sleep 30; echo "Deuxième !" ) &
[2] 13651
$ jobs
[1]-  Running                 sleep 1m && echo ...
[2]+  Running                 sleep 30 && echo ...
$ fg %2
^Z
[2]+  Stopped                 sleep 30 && echo ... 
$ jobs
[1]-  Running                 sleep 1m && echo ...
[2]+  Stopped                 sleep 30 && echo ...
$ sleep 30; bg
Premier !
[2]-  Done                    sleep 30 && echo ...
Deuxième !
$ jobs
[1]-  Done                    sleep 1m && echo ...
$ vi foo
^Z
[1]+  Stopped                 vi foo
$ exit
There are stopped jobs.
$ kill -9 %% #fg :x
$ exit

Fichiers et FS

Savoir si lignes en doublon dans un fichier

$ uniq -d <fichier>

ou autrement (appliquer un filtre différent) :

$ diff <fichier> <(cat <fichier> | uniq)

Comparer deux fichiers quant à l'existence de nouvelles lignes

$ grep -F -x -v -f <fichier1> <fichier2>

Analyse disque

Quand il s'agit de / - penser à exclure les autres partitions (si existante de toute évidence) :

# ncdu / --exclude /home --exclude /srv --exclude /var --exclude /tmp --exclude /boot

Pour certaines anciennes versions :

# ncdu --exclude "/home/*" /

Sinon voir du côté de HowtoDUC.

Surveiller les ouvertures/écriture des fichiers présent dans un répertoire

$ iwatch <target>

Savoir les différents users qui ont écris dans /tmp

$ stat -c %U /tmp/* | sort | uniq -c | sort -n

Tester l'écriture disque

Simplement, en écriture (fichier de 5.1GB) :

$ dd if=/dev/zero of=test count=10000000

Lister les répertoires ayant le plus de fichiers <=> max inode

PATH_TO_WATCH='/var'
RESULT_FILE='list_max_inode.txt'
TMP=$(mktemp)
#Regarder dans le premier niveau
(for i in $(find $PATH_TO_WATCH -type d); do echo $(ls -a $i | wc -l) $i; done) | sort -n > $TMP
#compter dans les sous niveaux
cat $TMP | (while read line; do num=$(echo $line | awk '{ print $1 }'); path=$(echo $line | awk '{ print $2 }'); echo ${path%/*}; done) | sort | uniq | (while read line; do echo $(grep "$line" $TMP | cut -f1 -d' ' | xargs echo -n | tr -s ' ' '+' | xargs echo | bc -l) $line; done) | sort -n | tee $RESULT_FILE
rm $TMP

Supprimer des vieux fichiers

  • Par exemple, si + vieux de 30 jours en modification :
$ find DIR/ -type f -mtime +30 -delete
$ find DIR/ -type f -mtime +30 -exec rm '{}' \;

Utilisateurs UNIX

Lister les utilisateurs + groupe

UNIX

$ for user in $(getent passwd | awk -F ':' '$3 > 10000 {printf $1 " "}'); do groups $user; done

LDAP

$ for user in $(getent passwd | awk -F ':' '$3 > 10000 {printf $1 " "}'); do \
ldapsearch -x -h localhost -LLL -b "uid=$user,ou=people,dc=MACHINE,dc=evolix,dc=net" cn | tail -n2 | \
tr '\n' ' ' | cut -d':' -f2 | echo -n "$(cat <&0)"; echo = $(groups $user); done

Serveur web

Avoir un rendu des requêtes par IP à partir d'un access.log

Avoir un compte rendu pour un laps de temps :

# date; (timeout 60 tail -f /var/log/apache2/access.log | cut -d' ' -f1) | sort | uniq -c | sort -n

Ou regarder les IPs en direct :

  • Version simple :
# tail -f /var/log/apache2/access.log | stdbuf -oL cut -d ' ' -f1 | uniq -c 
  • Version couleur :
# SEUIL=5; tail -f /var/log/apache2/access.log | stdbuf -oL cut -d ' ' -f1 | stdbuf -oL uniq -c | \
eval "awk '\$1 > $SEUIL {printf \"\\033[1;31m\" \$1 \" \"  \$2 \"\\033[0m \\n\"; next;};{printf \$1 \" \" \$2 \"\\n\";}'"

Process

Un processus par rapport à une socket/port

  • Connaître les sockets ouvertes et ports en écoutent par un processus :
$ lsof -Pan -p PID -i
  • Connaître le pid qui écoute sur un port (2ème colonne) :
$ lsof -i :Port