Catégorie : shell

Equivalent dos2unix

Sous Linux/Unix, Si vous cherchez à transformer un texte DOS (va de retro Satanas) en texte Unix, voici une solution rapide et efficace :

awk '{sub(/\r$/,"");print}' nom_fichier_dos > nom_fichier_unix
ou bien encore :
sed 's/.$//' nom_fichier_dos > nom_fichier_unix

Cette petite explication a été honteusement pompée ici, le but principal étant d’aider ceux qui ont du mal avec l’Anglais.

Vim : mémo pour des ordres simples

Je vais ici mettre toutes les astuces au fur et à mesure que je les découvre :

Le fichier de configuration personnalisé par rapport à l’utilisateur connecté est :
~/.vimrc

Directement sous vim comment éditer le fichier de configuration :
:e $MYVIMRC

Pour mettre des espaces au lieu de tabulations :
set expandtab

Pour dire à combien d’espaces à insérer lorsqu’on appuie sur Tab :
set tabstop=2

Les macros :

  • Commencer l’enregistrement :
    q[lettre]
  • Terminer l’enregistrement :
    q
  • Rejouer une macro :
    @[lettre]

Directement sous vim comment éditer un fichier de coloration syntaxique :
:e $VIMRUNTIME/syntax/

Tiré de l’aide et ré-expliqué à ma sauce :

  • Donner un ordre uniquement applicable sur le fichier en cours :
    setlocal [ordre]
  • Aller à la ligne automatiquement si la taille dépasse 78 caractères :
    textwidth=78
  • Appliquer un ordre que si le fichier est de type « text » :
    autocmd FileType text [ordre]
  • Mélange des 3 précédents points :
    autocmd FileType text setlocal textwidth=78
    Explication : dès que le fichier est de type « text », appliquer uniquement sur ce fichier cet ordre : aller à la ligne automatiquement si la taille dépasse 78 caractères.

Lancer une commande shell sans quitter vim :
:![commande shell]

Lancer un commande shell sans quitter vim :
:sh
(puis quand vous avez fini, quitter le shell via Ctrl-d ou l’ordre « exit ») et vous revenez sous vim !

Si vous avez d’autres suggestions surtout n’hésitez pas !

Linux Cron : mémo rapide / exemples concrets

Bon, pour tous ceux qui veulent utiliser cron, voici comment il fonctionne (c’est souvent le plus difficile à comprendre).

Toutes les minutes, le système vérifie s’il faut qu’il lance un programme. Comment fait-il sa vérification ?
C’est simple : il prend date + heure du moment et la décompose.
Prenons aujourd’hui et maintenant :

Samedi 27 février 2010, 1h44 du matin

Cela va être décomposé ainsi :

Minutes / Heures / Jour / Mois / Jour de la semaine
44      / 01     / 27   / 02   / 6

Et le système va lister toutes les tâches, et si les chiffres sont identiques, alors il l’exécute.
Exemple :

* * * * * root ping -c 1 google.fr > /dev/null

Le «*» signifie : «quelque que soit le chiffre, c’est valide».
Comparaison :

Minutes / Heures / Jour / Mois / Jour de la semaine
44      / 01     / 27   / 02   / 6
*       / *      / *    / *    / *

Tout correspond => exécution de la tâche !
Maintenant, des exemples qui vont vous servir :

# m h dom mon dow user  command
17 *  * * * root    [commande]

Lancer la commande toutes les fois où «minutes = 17» => lancer «[commande]» toutes les heures (00:17, 01:17, 02:17, 03:17 etc.).

# m h dom mon dow user  command
25 6  * * * root    [commande]

Lancer la commande toutes les fois où «minutes = 17» et «heure = 6» => lancer «[commande]» tous les jours à 6:17.

# m h dom mon dow user  command
47 6  * * 7 root    [commande]

Lancer la commande toutes les fois où «minutes = 47, heure = 6» et «jour de la semaine = 7» => lancer «[commande]» tous les dimanches à 6:47.

# m h dom mon dow user  command
52 6  1 * * root    [commande]

Lancer la commande toutes les fois où «minutes = 52, heure = 6» et «jour du mois = 1» => lancer «[commande]» tous premiers du mois à 6:52.

Un peu plus complexe mais plus pratique : on peut préciser des intervalles : «2-6» veut dire «de 2 à 6 inclus». Exemple :

# m h dom mon dow user  command
* 1-6 * * * root    [commande]

Lancer la commande toutes les fois où «heure est comprise entre 1 et 6» => lancer «[commande]» toutes les minutes, de une heure à six heures du matin (c’est un exemple concret puisque «[commande], c’est une commande d’une araignée Internet (spider) qui va vérifier des choses pendant que tout le monde dort).

Un peu plus complexe mais encore plus pratique : on peut préciser des intervalles : «*/4» veut dire «tous les multiples de 4». Exemple :

# m h dom mon dow user  command
*/4 1-6 * * * root    [commande]

Lancer la commande toutes les fois où «heure est comprise entre 1 et 6» et «la minute est un multiple de 4» => lancer «[commande]» toutes les quatre minutes, de une heure à six heures du matin (c’est un exemple concret puisque «[commande]», c’est une commande d’une araignée Internet (spider) qui va vérifier des choses pendant que tout le monde dort).

PS : oui oui il est bien 1:44 du matin et je n’arrive pas à dormir…

Linux Shell : exemple de grep et expressions régulières

Ci-suivent des exemples de grep qui fonctionnent.
Je veux très souvent lister tous les fichiers php / htm / Javascript. J’ai deux possibilités :

  • find . | grep -E '(php|htm|html|js)$' | more
  • find . | grep '\(php\|htm\|html\|js\)$' | more

Je veux aussi souvent chercher parmi tous mes fichiers de mon site Internet, lesquels contiennent un mot particulier. Prenons par exemple le mot « Internet ». J’ai deux possibilités :

  • find . | grep -E '(php|htm|html|js)$' | xargs grep Internet
  • find . | grep '\(php\|htm\|html\|js\)$' | xargs grep Internet

Je le note parce que je ne comprenais pas pourquoi ce qui suit ne fonctionnait pas :
find . | grep '(php|htm|html|js)$' | xargs grep Internet

C’est tout simplement que par défaut (je ne sais pas si c’est le fait de mettre des quotes (« '« )) qui y fait, mais grep considère que ce qui est passé ainsi doit être cherché littéralement, et donc il ne ressortira que les fichiers dont le nom contient ces caractères : « (php|htm|html|js)« … ce qui n’est pas le but recherché. Mes exemples précédents, eux, fonctionnent correctement.

En espérant que cela serve à quelqu’un un jour !

Linux : changer les droits que sur des répertoires et sous répertoires

Voilà le problème :

Vous voulez mettre des droits en lecture uniquement sur tous les fichiers mais laisser le droit "x" sur les répertoires.

Voilà la solution la plus simple que j’ai décomposée volontairement pour être plus clair :

  1. Supprimer toutes les autorisations :
    chmod -R 0 ./*
  2. Ajouter les autorisations en lecture pour tout le monde :
    chmod -R ugo+r ./*
  3. Ajouter les autorisations en écriture uniquement pour le possesseur des fichiers :
    chmod -R u+w ./*
  4. Et la petite astuce pour que les autres puissent lire les répertoires et sous-répertoires :
    Appliquer le "x" uniquement sur les répertoires et sous répertoires (et pas sur les fichiers) :
    find . -type d | xargs chmod ugo+x

En résumé, copiez collez cette ligne :
chmod -R 0 ./* && chmod -R ugo+r ./* && chmod -R u+w ./* && find . -type d | xargs chmod ugo+x

Et vous aurez pour tout le monde le droit en lecture des répertoire et sous répertoires et le droit en écriture uniquement donné à l’utilisateur courant.
Attention : il n’y aura pas de fichier exécutable, car les autorisations "x" seront enlevées.

Linux : rechercher les programmes qui accèdent à un fichier

Comment rechercher les programmes qui accèdent à un fichier ?

Je vous donne un exemple concret : j’ai monté un répertoire qui est un lien vers un répertoire d’un autre PC.

La commande « mount ». Une fois que je n’en ai plus besoin, je fais « umount » pour le retirer. Et là, problème : ça ne fonctionne pas : il me dit qu’il ne peut pas le retirer, quelque chose y accède toujours !

Pas de problème : tapez :

lsof | grep [nom du répertoire monté]

et vous verrez quelles sont les applications qui y accèdent.

« lsof » vous sauve la vie.

Ca ne vous est jamais arrivé de pester contre Windows lorsque que vous faites « Retirer le périphérique » et que vous avez le message « Impossible de retirer le péripérique » ? Moi si. Avec lsof sur Linux, vous n’aurez jamais ce genre de désagrément !

Linux vsftp : mémo ajout d'un utilisateur

Voilà, je perds toujours un temps fou à rechercher comment ajouter un utilisateur pour qu’il se connecte sur le serveur ftp.

Si vous n’y arrivez pas, lisez le fichier de configuration :
/etc/vsftpd.conf
Dedans il y aura beaucoup d’informations utiles.

Voilà le résumé pour ajouter un utilisateur sur le serveur vsftp :

  1. Créer l’utilisateur. Par exemple :
    noeunoeu
  2. Changer son mot de passe :
    passwd noeunoeu
  3. L’ajouter à la fin des fichiers suivants :
    • /etc/vsftpd/chroot_list
    • /etc/vsftpd/user_list

Et voilà tout devrait fonctionner !

Linux : Cron et cronjob

Pour éditer la table cron de l’utilisateur en cours avec vi.

crontab -e

Ensuite pour un déclenchement chaque jour à minuit d’une tâche :

# Declenchement du script creation_zip chaque jour a minuit
0 0 * * * /xx/xx/nomduscript [params] > /dev/null 2>&1

Vous vous demandez peut-être ce que signifie la fin des paramètres que vous voyez juste au dessus :

/dev/null 2>&1

Cela signifie rediriger la sortie d’erreur (2) vers la sortie normale (1) : 2>&1 et rediriger la totale résultant vers la poubelle (« /dev/null« ).

Linux : configurer screen

Le fichier de configuration qui est chargé pour tout le monde est /etc/screenrc
Le fichier de configuration personnalisé est $HOME/.screenrc
Voilà un exemple qui m’a pris du temps avant de réussir à le mettre en place :
# -------------------------------------------
# Bindings de compilation

# -------------------------------------------
# Olivier Pons / 15 avril 2008
bind -c compil x exec /bin/sh -c "cd /sources/zeemoz/search/ && modsearch_install.sh"
bindkey "^x" command -c compil

Traduction des commandes précédentes :

  1. Tu lies la touche x de la classe compil à l’ordre complet :
    exec /bin/sh -c "cd /sources/zeemoz/search/ && modsearch_install.sh"
  2. Si on fait « ctrl x », cela veut dire qu’il faut se mettre en attente d’une touche pour exécuter ce qui concerne la classe compil

Dit autrement :

  1. Définir tous les ordres qu’on veut que screen exécute via un raccourci clavier ;
  2. Les associer à une touche simple ;
  3. Les associer à une classe ;
  4. Définir la classe selon un ctrl quelque chose.

Linux : exemples de "grep"

  1. Affiche tous les fichiers files qui contiennent une ligne dans laquelle il y a le mot poppy : 
    grep poppy files
  2. Affiche tous les fichiers files qui contiennent une ligne qui commence par poppy : 
    grep '^poppy' files
  3. Affiche tous les fichiers files qui contiennent une ligne qui se termine par poppy : 
    grep 'poppy$' files
  4. Affiche tous les fichiers files qui contiennent au moins une ligne dans laquelle il y a uniquement le mot  poppy : 
    grep '^poppy$' files
  5. Affiche tous les fichiers files qui contiennent au moins une ligne qui contient par  ^s, nb : le \ sert à ignorer le caractère spécial ^ : 
    grep '\^s' files
  6. Affiche tous les fichiers files qui contiennent, soit  poppy, soit Poppy : 
    grep '[Pp]oppy' files
  7. Affiche tous les fichiers files qui contiennent popy, pOpy, poPy ou pOPy : 
    grep 'p[oO][pP]y' files
  8. Affiche tous les fichiers files qui contiennent au moins une ligne vide : 
    grep '^$' files
  9. Affiche tous les fichiers files qui contiennent deux nombres d’affilée : 
    grep '[0-9][0-9]' files
  10. Recherche de tous les fichiers php, htm ou html :
    locate . | grep '[ph][ht][pm][l]*$' | more
  11. Recherche de tous les fichiers php, htm ou html contenant le mot internet :
    locate . | grep '[ph][ht][pm][l]*$' | xargs grep internet | more
  12. Recherche de tous les fichiers php, htm ou html contenant le mot internet sans être sensible à la casse :
    locate . | grep '[ph][ht][pm][l]*$' | xargs grep -i internet | more