Bash

Utiliser tar sur ssh pour dupliquer des données (redirection tar sur ssh)

Utiliser tar sur ssh pour dupliquer des données (redirection tar sur ssh)

Voici un simple petit mémo pour l’utilisation de tar au travers de SSH.

L’idée est simple : utiliser la commande TAR pour répliquer un dossier d’une machine linux vers une autre.

L’intérêt est le maintient des attributs des fichiers et dossiers, en effectuant une copie à distance via un canal sécurisé.

Dans une console, il suffit de taper la commande suivante :

[bash]tar -cf – /mon_dossier_1 /dossier/dossier_2 | ssh -2 user@votre-serveur.com tar -xf – -C /dossier_de_destination/sur_serveur_distant/[/bash]

Ici, la commande va reproduire les dossiers « /mon_dossier_1 » et « /dossier/dossier_2 » dans le dossier « /dossier_de_destination/sur_serveur_distant/ » sur le serveur qui reçoit les données. Le -2 permet de forcer l’utilisation de SSH en version 2 qui est bien plus sécurisé que ssh 1.

C’est très intéressant pour copier un dossier home d’un utilisateur par exemple. Dans le cas ou vous utilisez une authentification basée sur clés SSH, vous n’aurez même pas de mot de passe à saisir.

Loading

Tags: , , , ,

lundi, novembre 1st, 2010 Bash, GNU - Linux, Reseau Aucun commentaire

AWK – remplacement de caractères et parser des fichiers

La commande awk permet d’effectuer des traitements sur des chaines de caractères ou des fichiers en se basant sur des modèles et un langage propre, ainsi que l’utilisation d’expressions rationnelles.

Premier exemple, parser une ligne contenant des termes séparés par un espace (tout se passe dans un terminal sous GNU/Linux of course) :
On charge une variable avec ces 3 mots :
[bash]ligne="mot1 mot2 mot3"[/bash]
Puis on veut extraire le premier mot :
[bash]echo $ligne|awk -F " " ‘{print $1}'[/bash]
ou extraire le premier et le troisieme :
[bash]echo $ligne|awk -F " " ‘{print $1 $3}'[/bash]

On notera qu’ici -F permet de définir le séparateur de champs, puis, la commande « print » permet d’afficher la valeur contenue dans le champs choisi (indexé de 1 à n). L’index « 0 » comme en bash, représente l’ensemble de la chaine originale passée en argument.

AWK permet également des traitements sur les chaines de caractères, afin par exemple d’opérer un remplacement basé sur un modèle.
On charge une variable avec une chaine :
[bash]ligne="le chien est noir,le chat est gris"[/bash]
Et on va changer la couleur du chien et ne garder que le chien :
[bash]echo $ligne|awk -F "," ‘{gsub("noir","blanc",$1);print $1}'[/bash]
Ceci va afficher « Le chien est blanc ». Comme vu plus haut, le -F permet de casser la chaine sur toutes les virgules rencontrées, chaque élément est accessible via l’index en variable ($1 ou $2 ici). Puis, la commande gsub (substitution) permet de remplacer toute valeur « noir » par « blanc », dans la variable $1 (soit la partie avant la virgule).

La commande gsub s’est donc appliquée à $1, l’instruction print est indépendante, on aurait pu taper:
[bash]echo $ligne|awk -F "," ‘{gsub("noir","blanc",$1);print $1","$2}'[/bash]
afin d’afficher la partie modifiée et la seconde non modifiée.

Jusqu’ici nous avons travaillé sur des variables, mais awk permet de travailler sur des fichiers pour un traitement rapide.
Prenons le fichier /etc/passwd qui contient des éléments de ce type : root:x:0:0:root:/root:/bin/bash

Nous souhaitons par exemple afficher une liste des utilisateurs existants, leur home, et le shell associé. On constate donc que le « : » peut être utilisé comme séparateur.
Nous allons donc afficher le listing voulu de la manière suivante (login => home => shell) :
[bash]awk -F "\:" ‘{print $1" => "$6" => "$7}’ /etc/passwd[/bash]

Dans ce dernier point, nous avons parsé directement un fichier, et affiché le résultat dans la console. Il est possible de renvoyer le résultat dans un fichier avec une simple redirection :
[bash]awk -F "\:" ‘{print $1" => "$6" => "$7}’ /etc/passwd > mon_listing.txt[/bash]

Vous pouvez utiliser différents caractères spéciaux codés de la manière suivante :
\\ Un antislash.

\b retour arriere (backspace).

\n nouvelle ligne.

\r retour chariot.

\t tabulation horizontale.

\v tabulation verticale.

De manière générale les caractères spéciaux (* % etc.) doivent être « échappés » par un antislash.

On peut également utiliser les expressions régulières (ou rationnelles) afin de définir un séparateur.
[bash]awk -F "[^a-z|^A-Z|^0-9|^–|^/|^,]" ‘{print $1" => "$2" => "$3" => "$4" => "$5" => "$6" => "$7}’ /etc/passwd[/bash]

Dans l’exemple ci dessus, on va lire le fichier /etc/passwd on utilisant comme séparateur de champs l’expression rationnelle suivante :
[bash][^a-z|^A-Z|^0-9|^–|^/|^,][/bash]

Celle ci signifie que sera considéré comme séparateur de champs tout caractère qui n’est pas alphanumérique en majuscule ou minuscule, et différent de -, de / et de ,.

Plus d’informations sur les expressions rationnelles : http://fr.wikipedia.org/wiki/Expression_rationnelle

Dernier exemple, on va passer une chaine en majuscule avec la fonction « toupper » (il existe aussi tolower pour l’inverse):
[bash]echo "Coucou comment ça va?"|awk ‘{print toupper($0)}'[/bash]

Pour plus d’informations, man awk

Loading

Tags: , , , , , , ,

mardi, octobre 26th, 2010 Bash, GNU - Linux, Technologie 2 Comments

Bash : lire un fichier ligne par ligne avec une boucle while

Encore une fois, rien ne vaut l’apprentissage par l’exemple. Ci dessous le fichier bash exemple, qui va lire le fichier /etc/passwd ligne par ligne.

[bash]#!/bin/bash
while read line
do
echo ${line}
done < /etc/passwd[/bash]

donc ici, les lignes sont chargées dans la variable « line » et simplement affichées par la commande echo, mais on peut utiliser ça dans bien des situations ;)

Note : Pour fonctionner, ce fichier doit être appelé par la commande [bash]sudo sh fichier.sh[/bash] ou, en le rendant exécutable après enregistrement, comme suit :

[bash]chmod +x fichier.sh[/bash]

Puis est lançable directement :

[bash]sudo ./fichier.sh[/bash].

On utilise ici « sudo » car il y a des chances que ce fichier ne soit accessible que par le compte root.

Loading

Tags: , , , , , , ,

jeudi, octobre 14th, 2010 Bash, GNU - Linux, Technologie Aucun commentaire