Syntaxe usuelle d la commande tar pour la création d’une archive
soit la structure de fichiers suivant :
./test/folder1/folder1a/fichier1.txt
./test/folder1/fichier1.txt
./test/folder2/fichier3.txt
Nous sommes dans le répertoire test, et nous créons une archive de façon classique sans compression:
> tar -cvf archive.tar *
folder1/
folder1/folder1a/
folder1/folder1a/fichier1.txt
folder1/fichier1.txt
folder2/
folder2/fichier3.txt
Pour voir le contenu sans le désarchiver
> tar -tf archive.tar
folder1/
folder1/folder1a/
folder1/folder1a/fichier1.txt
folder1/fichier1.txt
folder2/
folder2/fichier3.txt
Nous voyons que les fichier ainsi que les dossiers sont préservés, ainsi si vous décompressez l’archive dans un autres répertoire, la structure sera conservée.
Archiver avec tar sans garder la structure des fichiers
Parfois on a envie de rassembler tous les fichiers sans conserver l’arborescence, dans un unique répertoire. Voici comment faire :
On se place dans le répertoire à archiver.
> find . -type f | tar --transform='s|^\./||;s|/|_|g' -T - -cvf archive.tar
on pipe deux commandes
find .-type f va trouver tous les fichiers à partir de là où se trouve l'invite de commande
Le seconde commande va archiver avec une transformation, on renomme les fichiers qui sont à archiver pour les rendre uniques. Le format du nom du fichier est composé de mot du chemin vers le fichier dont les slash seront transformés en underscore.
> tar -tf archive.tar
folder1_folder1a_fichier1.txt
folder1_fichier1.txt
folder2_fichier3.txt
Le renommage est plus prudent car on peut avoir deux fichiers du même nom.
Nous allons voir comment crypter en ligne de commande un message et ensuite le décrypter. Il existe plusieur contexte pour faire cette opération, comme avec un langage de programmation, mais cela reviens à utiliser un programme comme OpenSSL.
Il se peut que vous ayez une erreur du type : unable to load Private Key
Ceci vient du fait que vous avez une clé du type open SSH. Il faudrait une clé de type PEM. Voici la commande pour convertir en clé PEM. Mais avant veuillez faire un cat sur votre clé privée
cat id_rsa.pub
Si vous voyez un texte commençant par
-----BEGIN RSA PRIVATE KEY-----
ce n'est pas bon il faut qu'il commence par
-----BEGIN PUBLIC KEY-----
Essayez avec cette comamnde pour convertir votre clé
ssh-keygen -f id_rsa.pub -e -m pem > public.pem
et regardez le début de votre clé privée, si ça commence toujours par -----BEGIN RSA PRIVATE KEY-----
ce n'est toujours pas bon (vous pouvez vous enrendre compte en essaynt de crypter.
Il vous faut faire la commande suivante :
ssh-keygen -f id_rsa.pub -e -m PKCS8 > public.pem
Grâce à l'ajout de PKCS8, en vérifiant le contenu de la clé qui doti avoir le bon en-tête
Maintenant vous pouvez tenter de crypte avec la ligne suivante :
echo "your secret message" | openssl rsautl -encrypt -pubin -inkey public.pem > encrypted.txt
Commande pour décrypter
Essayez d’afficher encrypted.txt, ce sera du charabia. Maintenant il faut faire l’opération inverse
openssl rsautl -decrypt -inkey id_rsa -in encrypted.txt
Le message en clair va s'afficher
Récapitulatif
Créer la paire de clés SSH, on se sert de la publique id_rsa.pub
convertir la clé SSH publique au format PEM avec l’argument PKCS8
utiliser la commande pour chiffrer
utiliser la command pour déchiffrer
Où est la clé privée?
Vous avez remarqué que nous n’avons pas parlé de clé privée du tout, on en avait pas besoin. En fait l’usage de la clé privée sert dans un processus de signature, pas dans le contexte de chiffrement de message.
Deux Scénarios dans RSA
1. Confidentialité des données (Chiffrement standard)
Chiffrer avec la clé publique : Tout le monde peut chiffrer des données en utilisant la clé publique.
Déchiffrer avec la clé privée : Seul le propriétaire de la clé privée peut déchiffrer les données. C’est le cas d’utilisation typique pour envoyer des messages en toute sécurité.
2. Signatures numériques (Authentification et intégrité)
Signer avec la clé privée : La clé privée génère une signature pour un message.
Vérifier avec la clé publique : Toute personne disposant de la clé publique peut vérifier que la signature a été générée par la clé privée correspondante. Ce cas d’utilisation garantit l’authenticité des données et qu’elles n’ont pas été altérées.
Je me suis intéressé récemment à faire des requêtes de al façon la plus basique possible. Loin des librairies qui vous masquent ce qui se passe sous le capot, on va voir les technique dans le shell qui permettent de faire des requêtes réseau, je suis sûr que je n’aurais pas la technique la plus bas niveau mais on va s’en rapprocher.
CURL
Ce programme est mondialement connu, il est présent partout, dans toutes les plateformes. Il est présent dans tous les langages. Par exemple la librairie curl en PHP permet de faire tout type de requête réseau. Voyons comment en shell nous pouvons faire une requête basique
curl https://yvonh.com/ -o yvonh.html
cat yvonh.html //lire le fichier généré qui est vide
L’argument -o va rediriger l’output dans un fichier texte avec extension HTML.
Dans ce cas précis vous n’allez rien voir, car il y a une redirection vers www.yvonh.com, or par défaut Curl ne suit pas la redirection. Il va retourner un résultat vide. La requête suivante va instruire Curl de suivre les redirections.
curl -L https://yvonh.com -o yvonh.html
On en va pas voir en détail toutes les commandes de Curl, on va voir les autres méthode de requêtage réseau
wget
wget est une commande très souvent utilisée
wget -qO- https://www.example.com
openssl
openssl s_client -connect www.example.com:80
Il y a aussi d’autres commandes mais qui ne sont pas toutes présentes dans Linux
Rsync permet de synchroniser des dossiers, où qu’ils soient pourvu que deux machine aient accès via des clés SSH.
Par exemple soient les machines Msource et Mtarget. Msource doit générer une clé SSH et mettre la clé publique dans Mtarget. Ainsi Msource pourra se connecter sans mot de passe à Mtarget.
Bien que su rLinux Rsync soit disponible par défaut, sur Window c’est assez compliqué de l’installer.
Nous partirons du postulat qu’on est sous Linux et que Rsync est présent.
Synchronisation d’un fichier avec Rsync
rsync -a monfichier.txt login_mtarget@mtarget.com:/home/public_html
Synchronisation d’un dossier avec Rsync
rsync -a repertoire1 login_mtarget@mtarget.com:/home/public_html
Tous les fichier du repertoire1 seront copié dans le répertoire /home/public_html de la machine cible Mtarget.
Lorsque vous téléchargez un fichier depuis Internet, vous pouvez vérifier le checksum (quand il est donné par le site) d’un fichier pour vérifier qu’il n’est pas corrompu, c’est à dire que que le checksum est identique à celui donné par le site.
Windows
certutil -hashfile nom_fichier SHA256
Linux
sha256sum nom_fichier
Ces commandes ont bien sûr des options mais ici c’est le minimum syndical qui est montré, et c’est ce dont on a le plus souvent besoin.
vous allumez votre serveur web local, vous démarrer Ngrok avec la commande suivante :
$ ngrok http 80
#vous aurez un écran comme ceci
ngrok by @inconshreveable (Ctrl+C to quit)
Session Status online
Account apple (Plan: Free)
Version 2.3.35
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://xxxxxxxx.ngrok.io -> http://localhost:80
Forwarding https://xxxxxxxx.ngrok.io -> http://localhost:80
Connections ttl opn rt1 rt5 p50 p90
12 0 0.00 0.00 5.13 5.90
Notez bien l’url ayant comme domaine ngrok.io, il s’agit de l’adresse qui va aiguiller les requêtes su monde Internet vers votre site web en local !
En effet votre localhost n’est pas visible vis à vis de l’Internet. Car vous êtes derrière votre box ADSL ou Fibre, ce dernier doit être configuré en mode routeur pour que votre ordinateur soit accessible depuis le cloud. Heureusement que par défaut ce n’est pas le cas !
Vous disposez des deux adresses un en http et l’autre en https. Cette adresse va être mappée à votre http://localhost, si vous avez plusieurs sites dans leur répertoire, vous y accéderez en spécifiant le répertoire jusqu’à leur racine.
Par exemple soit la structure de répertoire suivant :
/
site1/
site2/
site3/public
Par défaut le / indique le répertoire racine du web correspondant à http://localhost. Pour accéder à site1 il vous faudra y accéder via :
http://xxxxxxxx.ngrok.io/site1
# de même
http://xxxxxxxx.ngrok.io/site2
http://xxxxxxxx.ngrok.io/site3/public
Pour le cas du stie 3, un installation Laravel ou Symfony, la racine web se trouve dans le dossier /public donc il faut le mettre dans l'url.
Pour voir les requêtes entrantes
Nous disposons d’un outil très intéressant pour savoir ce qu’on reçoit en nous mettons du côté du serveur web, en allant à l’adresse http://localhost:4040/, nous pouvons voir les requêtes entrantes et leurs détails.
Exemple d’utilisation de NGrok
J’ai eu à développer une application en React Native, qui s’appuie sur un back-end Laravel, et il y a vait des opérations Ajax de création d’utilisation ou d’identification, le problème c’est sous IOS, les urls des endpoints devaient être en https ! J’ai trouvé fastidieux de configurer en local un certificat SSL pour le développement, aussi j’ai dû pour faire mes test monter un virtual host sur un dédié, ce qui m’a pris un peu de temps.
Mais grâce à Ngrok, j’ai trouvé un moyen de requêter sur une url https vers un serveur de test (en l’occurence celui en localhost) très facilement, ce qui devrait accélérer le temps de développement !
D’autres usages : montrer à votre client son site web, ou à vos collègues développeurs.
Mais il y a bien plus de choses et je vous renvois à la documentation officielle pour les détails.
Ngrok Symfony
Quand vous utilisez un virtualhost en local pour développer une application comme Symfony, il faut faire une maniplation différente pour accéder à votre application web. En effet le répertoire qui sera exposé à Internet est dans le cas de Symfony 4. le répertoire /public. Si vous essayer d’accéder via la méthode décrite au début ça ne marchera pas, vous aurez une erreur. Il faut faire une autre commande :
./ngrok http -host-header=rewrite monsite:80
Avec cette méthode, quelqu’un de l’extérieur accédera à votre site en local comme si vous accédiez à votre site en local.
J’ai eu besoin de faire rapidement et surtout simplement un script pour avoir le header HTTP d’un fichier d’urls. Dans mon cas le plus simple était de faire un script shell et de lui donner à manger un fichier d’url. Couplé à Curl, on peut simplement avoir une masse de résultats facile à lire.
D’abord la commande curl qui permet d’avoir le header HTTP
De fil en aiguille en faisant un script qui lisait un fichier ligne par ligne, et ensuite appliquait la commande ci-dessus, et en insérant le résultat de la commande dans un fichier nous obtenons un fichier de résultats exploitable, voici le script ci-dessous :
#!/bin/bash
file="/home/creatissus/url.txt"
truncate -s 0 out.txt
while IFS= read line
do
header="$(curl --head -k "$line" | grep HTTP)"
echo "$line $header" >> out.txt
done <"$file"
Nous obtenons un fichier où chaque ligne est l’url suivi du code HTTP. Pour finir extrayons les ligne contenant le code 404 :
grep 404 url.txt > 404.txt
Et voilà j’espère que cela vous a plu et que ce script vous soit utile.
Personnellement je confondais souvent Awk et Sed, je ne voyais pas trop la différence. Mais maintenant ce qu’il faut retenir c’est que Awk travailler avec des fichiers dont les lignes sont semblables, genre fichier .csv. pour ce qui est de Sed, on l’utilisera plutôt pour remplacer des caractères par d’autres.
La similitude entre les deux outils est qu’ils travaillent ligne par ligne.
Recettes génériques Sed :
sed 's/"//g' efface les guillemets
sed 's/^/"/' ajoute un guillemet au début de chaque ligne
sed 's/$/"/' ajoute un guillemet à la fin de chaque ligne
sed 's/|/"|"/g' adds a quote before and after each pipe.
Pour être à l’aise avec Sed, il faut connaitre un peu les expressions régulières.
Configurer votre éditeur VIM pour améliorer votre productivité
Le fichier de configuration se trouve dans le répertoire d’installation C:\Program Files (x86)\Vim.
Le fichier a éditer est _vimrc. Attention il vous faudra ouvrir votre éditeur en mode Administrateur sinon, vous ne pourrez pas modifier le fichier (pas sauvegarder).
Ci-dessous le fichier d’origine :
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin
set nobackup
set nowritebackup
set noundofile
set guifont=Courier_New:h11:cANSI
set diffexpr=MyDiff()
function MyDiff()
let opt = '-a --binary '
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
let arg1 = v:fname_in
if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
let arg2 = v:fname_new
if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
let arg3 = v:fname_out
if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
if $VIMRUNTIME =~ ' '
if &sh =~ '\<cmd'
if empty(&shellxquote)
let l:shxq_sav = ''
set shellxquote&
endif
let cmd = '"' . $VIMRUNTIME . '\diff"'
else
let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
endif
else
let cmd = $VIMRUNTIME . '\diff'
endif
silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3
if exists('l:shxq_sav')
let &shellxquote=l:shxq_sav
endif
endfunction
#dans certaines plateformes, le fichier d'origine peut être vide
Afficher les numéros de ligne dans VIM:
En mode éditeur, vous pouvez faire la commande suivante pour afficher les lignes :
:set number
#cacher les numéros de ligne
:set nonumber
:set nonu
Et on peut avoir les numéros relatifs de façon exclusive ou en même temps que les numéros absolu
Dans Vim, en mode navigation faire : (deux points) permet d’exécuter des commandes.
De même si vous voulez que les numéro de lignes soient automatiquement affichés à chaque démarage de Vim, il faut le mettre dans le fichier de configuration .vimrc
Changer la police et la couleur de fond à mettre dans le fichier .vimrc :
colorscheme darkblue
set guifont=DejaVu_Sans_Mono:h10:cANSI
Définir la taille par défaut de votre fenêtre d’édition (ceci est un must car la fenêtre fait 640 x 480 par défaut (environ). Avec le terminal multiplexer TMUX, vous pouvez subdiviser votre fenêtre en sous fenêtres.
set columns=200
set lines=50
exemple de configuration : https://alvinalexander.com/linux-unix/vimrc-vim-example-commands-configuration-file