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