Shell Scripting

Faire des requêtes réseau dans le terminal

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

nc, /dec/tcp, telnet, /dev/udp

Rsync pour synchroniser des répertoire avec une machine distante

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.

Savoir quel programme utilise un port

Cette commande sous terminal DOS liste les différents ports utilisé

netstat -ano -p tcp 
Connexions actives

  Proto  Adresse locale         Adresse distante       État
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       8988
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       1080
  TCP    0.0.0.0:443            0.0.0.0:0              LISTENING       8988
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:554            0.0.0.0:0              LISTENING       1020
  TCP    0.0.0.0:2869           0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING       17352
  TCP    0.0.0.0:5040           0.0.0.0:0              LISTENING       6168
  TCP    0.0.0.0:5357           0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:10243          0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:33060          0.0.0.0:0              LISTENING       17352
  TCP    0.0.0.0:49664          0.0.0.0:0              LISTENING       784
  TCP    0.0.0.0:49665          0.0.0.0:0              LISTENING       724
  TCP    0.0.0.0:49666          0.0.0.0:0              LISTENING       1692
  TCP    0.0.0.0:49667          0.0.0.0:0              LISTENING       1600
  TCP    0.0.0.0:49668          0.0.0.0:0              LISTENING       3108
  TCP    0.0.0.0:49669          0.0.0.0:0              LISTENING       776
  TCP    127.0.0.1:5354         0.0.0.0:0              LISTENING       3588
  TCP    127.0.0.1:5939         0.0.0.0:0              LISTENING       4296
  TCP    127.0.0.1:55676        0.0.0.0:0              LISTENING       23680
> tasklist |find "8988"
httpd.exe                     8988 Console                   17    15 688 Ko

Cette commande va indiquer spécifiquement le programme rattaché au processus. httpd.exe est le programme Apache.

Vérifier le hash (checksum) sha1 d’un fichier

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.

Tuto NGrok, un outil pour tester vos sites et applications web

Update 22/07/2024 : cela fait quelques années qu’il faut créer un compte pour pouvoir utiliser Ngrok, je le mets là

C’est par hasard que j’ai rencontré ce logiciel que je connaissais de nom sans savoir ce qu’il faisait, en fait je le confondais avec Grok.

NGrok est un logiciel qui permets d’exposer votre localhost à internet, ce se fait grâce à un tunnel SSH.

Commencez par télécharger le zip du logiciel, décompressez le pour avoir un exécutable (pas besoin d’installation)

Démarrer Ngrok

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.

Usages possible de Ngrok

Script shell pour connaitre le code HTTP d’une page web

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

curl --header -k https://monsite.fr/page.html

HTTP/1.1 410 Gone
Date: Wed, 23 Oct 2019 20:32:02 GMT
Server: Apache/2.4.25
Content-Type: text/html; charset=iso-8859-1

Ce qui m’intéressait était le code HTTP, donc avec un grep on peut extraire la ligne qui nous intéresse

curl --header -k https://monsite.fr/page.html | grep 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.

Linux utiliser Sed pour manipuler les chaines de string

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 l’éditeur VIM sous Windows, Linux ou MacOS

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

:set relativenumber
#ou
:set rnu
#pour enlever
:set nornu

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

Autres liens vers VIM

Retour en haut