Catégorie « Linux »

Quelques trucs sur UNIX/Linux #5

Générer un mot de passe aléatoire

Pour générer une chaîne aléatoire, pouvant par exemple servir de mot de passe, dans un terminal entrer la ligne suivante :

< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c 10; echo ""

Il est possible de modifier les caractères autorisés via l’option -dc de urandom et le nombre de caractères via l’option -c de head.

Le echo "" sert juste à forcer un retour à la ligne.

Correction d’une commande

Dans le terminal, il est possible de la ré-exécuter la dernière commande en remplaçant la première occurrence d’une chaîne par une autre.

Exemple :

# Affiche 'toto'
echo 'toto'
# Affiche 'tato'
^to^ta^

Ceci peut être utile pour corriger une faute de frappe. Attention, seule la première occurrence est remplacée et la nouvelle commande est exécutée dans la foulée sans demande de confirmation.

Revenir en arrière dans les répertoires

La commande cd permet de revenir au précédent répertoire où l’on était via cd -.

Attention, cela fait bien retourner au dernier dossier où l’on était et pas remonter d’un cran dans l’arborescence (qui se fait via cd ..).


Quelques trucs sur UNIX/Linux #4

Crontab et 49-3

Crontab : changer l’adresse e-mail de destination

Il est possible de spécifier l’utilisateur destinataire des mails de la crontab en définissant la variable MAILTO en début de fichier.

Remplacement de l’adresse par défaut :

MAILTO=webmaster@mon-site.fake

Désactivation de l’envoir de mail :

MAILTO=""

(source)

Crontab : redirection de la sortie dans un fichier

Par défaut cron envoie par mail l’ensemble des sorties (standard et erreur) des tâches exécutées. Il peut être intéressant d’écrire tout ça dans des fichiers de logs à la place.

Pour ce faire il suffit d’utiliser les mécanismes de redirections de sorties habituellement disponibles dans les terminaux en terminant la ligne par > /path/to/log/file 2>&1. La première partie (> /path/to/log/file) déclenche la redirection de la sortie standard, la seconde partie (2>&1) effectue la redirection de la sortie d’erreur dans la sortie standard.

Exemples :

# Redirection de la sortie standard dans le fichier /path/cron.log et envoi par e-mail de la sortie d'erreur
* * * * * /path/to/script > /path/cron.log

# Redirection des sorties standard et erreur dans le fichier /path/cron.log
* * * * * /path/to/script > /path/cron.log 2>&1

(source)

Rejouer la dernière commande en ajoutant sudo

Il m’arrive de temps en temps de lancer une commande nécessitant les droits root en oubliant de la précéder par sudo. Il est possible de rappeler la dernière commande l’historique mais la syntaxe est un poil longue et compliquée.

La solution que j’ai retenue est donc d’ajouter un alias dans mon fichier .bash_aliases :

# 49.3
alias 49.3='sudo "$BASH" -c "$(history -p !!)"'

Le nom 49.3 est court et facile à retenir puisqu’il fait directement référence à l’article 49 alinéa 3 de la constitution française dont le principe est somme toute assez proche ^^


Quelques trucs sur UNIX/Linux #3

Supprimer un grand nombre de fichiers

Quand on a un très grand nombre de fichiers dans un dossier, un simple rm xxx* ne fonctionne pas forcément. J'ai eu le cas notamment avec des sessions PHP qui ne s'effaçaient pas correctement et qui du coup s'accumulaient en masse.

Une solution qui fonctionne est de passer par find :

find . -name 'sess_*' | xargs rm

(source)

Supprimer les .svn d'un répertoire

SVN place un dossier .svn dans chaque dossier d'un projet (contrairement à GIT qui se contente d'un unique dossier .git à la racine).

Pour supprimer l'ensemble des fichiers .svn d'une arborescence, on peut passer par cette commande qui utilise encore une fois find :

find -type d -a \( -iregex ".*/.svn" \) -exec rm -rf {} \;

Exclure des dossiers d'un grep

Pour exclure des dossiers d'un grep, on utilise l'option --exclude-dir. Par exemple pour exclure le dossier .git lors d'une recherche dans des fichiers :

rgrep 'toto' modules/ framework/ --exclude-dir=.git

Du coup pour mes recherches dans le code de Change, je me suis fait cet alias dans mon .bashrc :

alias crep='rgrep --exclude-dir=.git'

On peut également passer par l'option --exclude.

(source)

Exclure des dossiers d'un tar

Les archives de mon serveur devenant un peu trop grosses, j'ai dû mettre en place quelques exclusions de dossiers (par exemple ne plus sauvegarder les logs, caches et médias formatés de mes sites sous Change).

Pour cela je suis passé par l'option -X (ou --exclude-from=) de tar qui permet d'indiquer un fichier contenant les motifs à exclure.

Exemple :

tar cvf archive.tar /home/change -X exclude.txt

Avec un fichier exclude.txt contenant :

/home/change/repository
/home/change/instances/*/log
/home/change/instances/*/cache
/home/change/instances/*/build
/home/change/instances/*/media/formatted
/home/change/instances/*/www
/home/change/instances/*/repository

Attention les motifs sont comparés aux chemins tels que vous les avez décrits. Dans mon exemple, j'ai un chemin absolu pour le dossier à archiver, il faut dont des motifs qui matchent ce chemin. Si j'avais donné un chemin relatif, j'aurais dû revoir mes motifs d'exclusion en conséquence.

On peut également utiliser --exclude en indiquant directement un motif à exclure. Mais c'est moins pratique quand on a toute une liste d'exclusions.


Un nom plus court pour la commande change.php

Cet article n'intéressera pas forcément grand monde. En même temps, le but premier de ce blog était bien à l'origine de me servir de bloc-notes pour garder une trace de certaines choses que j'ai eu plus ou moins de mal à trouver et/ou retenir, pas forcément à intéresser un public très large.

Donc là on parle de développement avec RBS Change et plus particulièrement de la commande change.php. Avant la version 3.5 il fallait installer une commande globale sur le serveur pour pouvoir l'exécuter, à partir de la version 3.5 cette commande globale n'est non seulement plus nécessaire mais carrément gênante (parce qu'on passe dans du code qui n'est plus compatible, même si on ne s'en rend pas compte tout de suite).

Mais toujours est-il que taper php framework/bin/change.php c'est vite lourd. Une solution possible est de passer par un alias de commande dans le .bashrc :

alias change.php="php framework/bin/change.php"

Mais par moment ça marche moyen. Surtout si la commande globale de la version 3.0.x est installée, parce que des fois on se retrouve à exécuter quand même la commande globale alors qu'on voulait exécuter celle contenu dans le framework.

Une meilleure solution est de passer par une commande personnalisée. Sur Ubuntu Serveur inclut par défaut (cf le fichier .profile) le dossier ~/bin dans le PATH. Ainsi il suffit de définir un fichier ~/bin/change.php (sans oublier de lui donner les droits d'exécution : chmod +x ./change.php) contenant :

#!/usr/bin/env php
<?php
if (file_exists("framework/bin/includes")) {
  $script = "framework/bin/change.php";
}
else
{
  $script = "/usr/local/bin/change.php";
}
if (file_exists($script))
{
  array_shift($argv);
  $script = $script . ' ' . implode(' ', $argv);
  system($script);
}
else
{
  echo "Could not find $script";
}

Personnellement j'ajoute aussi un lien symbolique pour pouvoir exécuter simplement c au lieu de change.php :

ln -nfs change.php c

Voilà voilà exécuter juste c plutôt que php framework/bin/change.php c'est quand même nettement plus agréable, surtout quand on développe et qu'on tape la commande toutes les 5 minutes :o


Quelques trucs sur UNIX/Linux #2

Ré-écriture d'URL avec Apache

Les règles de ré-écriture peuvent se placer soit dans le .htaccess, soit dans httpd.conf (ou dans les fichiers dédiés à chaque vhost). Il y a une subtile différence de syntaxe entre les deux cas : dans le cas du httpd.conf, URL relatives présentes dans les expressions rationnelles doivent être précédées d'un / et pas dans le cas du .htaccess.

Exemples :

.htaccess

RewriteCond %{HTTP_HOST} www.example.com
RewriteRule ^toto.html$ http://example.com/youpi.html$1 [R=301,L]

httpd.conf

RewriteCond %{HTTP_HOST} www.example.com
RewriteRule ^/toto.html$ http://example.com/youpi.tml$1 [R=301,L]

Résultat suivant dans la recherche dans l'historique de commandes

Lorsqu'on recherche dans l'historique via ctrl+r, taper à nouveau ctrl+r permet de passer au résultat suivant.

Déterminer la taille d'un dossier

Pour déterminer la taille d'un dossier on peut utiliser du, notamment avec les options :

  • h (human readable) : pour avoir un résultat lisible (type "1,7G") plutôt qu'un nombre d'octets
  • s : pour ne pas détailler tous les sous-dossiers

Exemples :

> du -hs .
2,7G     .
> du -hs ./*
8,0K     ./changeRepo.sh
2,7G     ./instances