| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
| informatique:divers [2024/11/24 09:02] – alexis | informatique:divers [2024/11/24 14:19] (Version actuelle) – alexis |
|---|
| ====== Divers ====== | ====== Divers ====== |
| Cette page est un fourre-tout de tout ce qui ne peut pas faire l'objet d'une page. Quand il y aura plusieurs choses qui pourront faire l'objet d'une page, elles seront déplacées. | |
| |
| <catlist informatique:divers -sortByTitle -noHead> | <catlist informatique:divers -sortByTitle -noHead> |
| |
| <WRAP todo> | |
| <code bash> | |
| # génération d'une archive en changeant les chemins des fichiers | |
| tar -C test.tar/ --transform="s/\./hello/" --transform="s/toto1/tata/" -cvzf tar.tar . | |
| |
| # génération d'un pdf à partir d'un md | |
| pandoc --from=markdown --to=latex -o Config.Switch.pdf --toc -N -V colorlinks -H head.tex -V geometry:"top=2cm,bottom=2cm,left=2cm,right=2cm" Config.Switch.md | |
| </code> | |
| </WRAP> | |
| |
| ===== Extraire les images d'un site ===== | |
| <code bash> | |
| # Version courte | |
| wget -nd -r -P ainw.org -Ajpg,jpeg --reject-regex ".*thumb.*" -l2 https://www.ainw.org | |
| |
| # Version longue | |
| wget --no-directories --recursive --directory-prefix ainw.org --accept jpg,jpeg --reject-regex ".*thumb.*" --level 2 https://www.ainw.org | |
| </code> | |
| |
| * ''%%-nd%%'' ou ''%%--no-directories%%'' ne cré pas l'arbre des répertoires. | |
| * ''%%-r%%'' ou ''%%--recursive%%'' active la récupération récursive. | |
| * ''%%-P%%'' ou ''%%--directory-prefix%%'' indique le répertoire d'enregistrement des fichiers téléchargés. | |
| * ''%%-A%%'' ou ''%%--accept%%'' conditionne la fin des noms des fichiers à télécharger. | |
| * ''%%--reject-regex%%'' rejette les URL ne respectant pas le motif. | |
| * ''%%-l%%'' ou ''%%--level%%'' détermine le niveau de récursion maximum. | |
| ===== Extraire des fichiers d'une archive en ligne ===== | |
| <code bash> | |
| # Version courte | |
| curl -L https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz | tar -x -J -f - -C /usr/local/sbin --strip 2 wkhtmltox/bin/wkhtmltopdf wkhtmltox/bin/wkhtmltoimage | |
| |
| # Version longue | |
| curl --location https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz | tar --extract --xz --file - --directory /usr/local/sbin --strip 2 wkhtmltox/bin/wkhtmltopdf wkhtmltox/bin/wkhtmltoimage | |
| |
| </code> | |
| |
| * Option de ''curl'' | |
| * ''%%-L%%'' ou ''%%--location%%'' refait la requête en cas de redirection. | |
| * Option de ''tar'' | |
| * ''%%-x%%'' ou ''%%--extract%%'' extrait les fichiers de l'archive. | |
| * ''%%-J%%'' ou ''%%--xz%%'' filtre l'archive avec [[https://en.wikipedia.org/wiki/Xz|xz]]. | |
| * ''%%-f%%'' ou ''%%--file%%'' utilise l'archive spécifiée. | |
| * ''%%-C%%'' ou ''%%--directory%%'' change le répertoire de travail avant toute opération. | |
| * ''%%--strip%%'' supprime les **//n//** répertoires précédant le fichier. | |
| |
| <WRAP info> | |
| Cette syntaxe est obligatoire lors de l'écriture de fichier Docker. Dans le cas de l'utilisation dans bash, on peut écrire la commande différemment : | |
| <code bash> | |
| curl -L https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz | tar -x -J -f - -C /usr/local/sbin --strip 2 wkhtmltox/bin/wkhtmlto{pdf,image} | |
| </code> | |
| </WRAP> | |
| |
| ===== Renommer des fichiers ===== | |
| Pour renommer des fichiers numérotés avec espaces de la forme ''mon fichier 01.txt'' en ''01-mon fichier 01.txt'', on peut utiliser ''sed'' et ''mv'' de la manière suivante : | |
| <code bash> | |
| IFS=$'\n' | |
| for SOURCE in *; do | |
| TARGET=$(echo $SOURCE| sed -e 's/\(.*\([0-9][0-9]\).*\)/\2-\1/') | |
| mv $SOURCE $TARGET | |
| done | |
| IFS=$' \t\n' | |
| </code> | |
| <WRAP important> | |
| Il faut noter que l'utilisation de ''sed'' dans cette configuration est gourmande. Si on essaye de renommer ''mon fichier 01 - 55.txt'', on aura le fichier ''55-mon fichier 01 - 55.txt'' au lieu de ''01-mon fichier 01 - 55.txt''. Dans ce cas, il faudra utiliser la commande suivante : | |
| <code bash> | |
| IFS=$'\n' | |
| for SOURCE in *; do | |
| TARGET=$(echo $SOURCE| sed -e 's/\([^0-9]*\([0-9][0-9]\).*\)/\2-\1/') | |
| mv $SOURCE $TARGET | |
| done | |
| IFS=$' \t\n' | |
| </code> | |
| </WRAP> | |
| |
| Il existe aussi un script Perl qui permet de faire cela à l'aide d'expressions régulières. Il est installé par défaut sur certaines distributions (ex : Ubuntu) mais pas sur d'autres (ex : Archlinux). | |
| On peut l'utiliser de la manière suivante : | |
| <code bash> | |
| # Renommer "fichier1" et "fichier2" en "fichier1.bak" et "fichier2.bak" | |
| rename 's/$/.bak/' fichier{1,2} | |
| |
| # Renommer "fichier 1" et "fichier 2" en "fichier1.bak" et "fichier2.bak" | |
| rename 's/ ([1,2])$/$1.bak/' fichier\ {1,2} | |
| |
| # Renommer "premier gros fichier" en "premier.Gros.Fichier" | |
| rename 's/ (.)/.\u$1/g' premier\ gros\ fichier | |
| |
| # Renommer "exemple d'un gros fichier" en "exemple.D.Un.Gros.Fichier" | |
| rename 's/[ '"'"'](.)/.\u$1/g' exemple\ d\'un\ gros\ fichier | |
| |
| # Renommer "fichier1" et "fichier2" en "FICHIER1" et "FICHIER2" | |
| rename 's/(.)/\u$1/g' fichier{1,2} | |
| rename 'y/a-z/A-Z/' fichier{1,2} | |
| |
| # Renommer "FICHIER1" et "FICHIER2" en "fichier1" et "fichier2" | |
| rename 's/(.)/\l$1/g' FICHIER{1,2} | |
| rename 'y/A-Z/a-z/' FICHIER{1,2} | |
| </code> | |
| |
| <WRAP important> | |
| Sur Ubuntu, les commandes sont utilisables directement. Sur Archlinux, il faut préfixer toutes les commandes par ''perl-''. Par exemple : | |
| <code bash> | |
| perl-rename 's/$/.bak/' fichier{1,2} | |
| # au lieu de | |
| rename 's/$/.bak/' fichier{1,2} | |
| </code> | |
| </WRAP> | |
| |
| ===== Ajouter un type dans ack ===== | |
| |
| Il faut modifier le fichier //[[https://metacpan.org/pod/ack#Use-the-.ackrc-file|.ackrc]]// et utiliser ''%%--type-set%%'' de la manière suivante : | |
| <code - .ackrc> | |
| # Type défini par une seule extension | |
| --type-set=api:ext:apib | |
| |
| # Type défini par plusieurs extensions | |
| --type-set=markdown:ext:md,apib | |
| |
| # Type défini par un motif | |
| --type-set=blade:match:/blade\.php$/ | |
| </code> | |
| |
| On peut visualiser le nouveau type en lançant la commande : | |
| <code bash> | |
| ack --help-types | |
| </code> | |
| |
| Pour plus d'information, voir [[https://metacpan.org/pod/ack#Defining-your-own-types|ici]] et dans la [[https://beyondgrep.com/documentation/|documentation officielle]] | |
| |
| ===== Ne pas chercher dans un répertoire avec ack ===== | |
| Il faut modifier le fichier //[[https://metacpan.org/pod/ack#Use-the-.ackrc-file|.ackrc]]// et utiliser ''%%--ignore-dir%%'' de la manière suivante : | |
| <code - .ackrc> | |
| --ignore-dir=<dirname> | |
| </code> | |
| |
| <WRAP info> | |
| Cette option peut être utilisées plusieurs fois pour ignorer plusieurs répertoires. Elle ne supporte que les noms de répertoires simples. | |
| Elle peut-être aussi utilisée directement lors de l'exécution de ''ack''. | |
| </WRAP> | |
| |
| |
| ===== Extraire une liste de chaînes de caractères ===== | |
| J'ai envie de récupérer l'ensemble des codes d'erreurs générés par mon API pour pouvoir les documenter. | |
| <code bash> | |
| # Version courte | |
| grep -roh --exclude="*.apib" "api.error[^'\"]*" src/ | |
| |
| # Version longue | |
| grep --recursive --only-matching --no-filename --exclude="*.apib" "api.error[^'\"]*" src/ | |
| </code> | |
| |
| * ''%%-r%%'' ou ''%%--recursive%%'' traite les répertoires récursivement. | |
| * ''%%-o%%'' ou ''%%--only-matching%%'' affiche ce qui correspond à la recherche. | |
| * ''%%-h%%'' ou ''%%--no-filename%%'' supprime l'affichage des noms de fichiers. | |
| * ''%%--exclude%%'' exclus les fichiers correspondants lors du traitement. | |
| |
| |
| ===== Redirection du traffic en HTTPS avec Apache ===== | |
| Il faut placer un fichier ''.htaccess'' à la racine du site avec le contenu suivant : | |
| <code apache .htaccess> | |
| RewriteEngine On | |
| RewriteCond %{HTTPS} !=on | |
| RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] | |
| </code> | |
| |
| ===== Trouver les lignes communes à 2 fichier ===== | |
| Il faut utiliser la commande ''comm''. Celle-ci va afficher le résultat sous la forme de 3 colonnes. La première contient les lignes présentes uniquement dans le premier fichier, la seconde contient les lignes présentes uniquement dans le second fichier, la troisième contient les lignes communes aux 2 fichiers. | |
| Il est possible de n'afficher que certaines colonnes en pointant celles que l'on veut supprimer. | |
| <code bash> | |
| # Affiche les 3 colonnes | |
| comm -- a.txt b.txt | |
| |
| # Affiche les lignes qui ne sont que dans un des 2 fichiers | |
| comm -12 -- a.txt b.txt | |
| |
| # Affiche les lignes communes aux 2 fichiers | |
| comm -3 -- a.txt b.txt | |
| </code> | |
| |
| ===== Vérifier la somme de contrôle d'un fichier ===== | |
| La [[https://fr.wikipedia.org/wiki/Somme_de_contr%C3%B4le|somme de contrôle]]((Aussi appelée empreinte)) est le résultat, de longueur fixe, de la transformation d'un fichier par une [[https://fr.wikipedia.org/wiki/Fonction_de_hachage|fonction de hachage]]. | |
| Selon la théorie des codes, à chaque empreinte correspond un seul et unique fichier. | |
| Mais ce n'est que de la théorie, car la recherche faisant des progrès, ce n'est [[https://en.wikipedia.org/wiki/MD5#Collision_vulnerabilities|plus tout à fait vrai]]. | |
| De ce fait, il est facile ensuite de vérifier si le fichier est bien ce qu'il prétend être en comparant son empreinte réelle avec son empreinte théorique. | |
| |
| Il existe différentes fonctions de hachages, mais les plus courantes (en tout cas sur GNU/Linux) sont MD5, SHA1 et SHA256. On préfèrera l'utilisation de l'algorithme SHA pour des raisons évidentes de sécurité. | |
| |
| <code bash> | |
| # Première méthode — Avec un programme externe | |
| echo "<chaîne de contrôle>" | sha256sum -c - | |
| |
| # Deuxième méthode — Avec une chaîne here-string | |
| sha256sum -c - <<< "<chaîne de contrôle>" | |
| |
| # Troisième méthode — Avec un fichier | |
| sha256sum -c <fichier de contrôle> | |
| </code> | |
| * ''-c'' permet de vérifier un fichier et son empreinte. | |
| <WRAP important> | |
| La chaîne de contrôle est composée de l'empreinte du fichier à vérifier, d'un espace, d'un astérisque et du nom de fichier à vérifier dans cette ordre. | |
| Par exemple, ''47ccc37db256387b70857f53a6067e8d50e692c9aa85e45e63e5190c5d1e0942 *Fedora-13-i686-Live.iso''. | |
| </WRAP> | |
| <WRAP tip> | |
| Le fichier de contrôle contient une chaîne de contrôle par ligne, ce qui permet de traiter plusieurs vérifications simultanément. | |
| </WRAP> | |
| |
| ===== Envoyer un courriel ===== | |
| <code> | |
| cat message.A.Envoyer | mail -s "Sujet du message" -a 'From: "Mon nom" <from@example.org>' -b bcc@example.org -c cc@example.org to@example.org | |
| </code> | |
| * ''-s'' permet de définir un sujet. | |
| * ''-a'' permet d'ajouter un entête additionnel. Ce paramètre peut être utilisé plusieurs fois. | |
| * ''-b'' permet d'ajouter une copie carbone invisible. Ce paramètre accepte une liste d'adresses séparées par des virgules. | |
| * ''-c'' permet d'ajouter une copie carbone. Ce paramètre accepte une liste d'adresses séparées par des virgules. | |
| |
| <WRAP todo> | |
| * Voir si je peux utiliser la syntaxe here-string. | |
| * Voir si je peux utiliser la syntaxe complète pour les adresses. | |
| </WRAP> | |
| |
| ===== Lancer un programme Java ===== | |
| <code bash> | |
| # Sans paramètre | |
| java -jar <fichier JAR> | |
| |
| # Avec l'utilisation d'un répertoire externe (utile pour l'inclusion de bibliothèques) | |
| java -Djava.ext.dirs=/usr/share/java/ -jar <fichier JAR> | |
| </code> | |
| |
| ===== Lancer un serveur HTTP ===== | |
| Depuis n'importe quel répertoire, il faut lancer la commande suivante : | |
| <code bash> | |
| python -m http.server | |
| </code> | |
| |
| ===== Récupérer l'identifiant d'une chaîne Youtube ===== | |
| <code javascript> | |
| document.querySelector('meta[itemprop="channelId"]').content | |
| </code> | |
| |
| ===== Afficher les entêtes d'une requête HTTP avec cURL ===== | |
| <code bash> | |
| curl -D - www.ainw.org -o /dev/null | |
| </code> | |
| * ''-D'' indique le fichier dans lequel enregistrer les entêtes de la réponse (ici //-// ou sortie standard). | |
| * ''-o'' indique le fichier dans lequel enregistrer le corps de la réponse (ici ///dev/null//). | |
| |
| ===== Partager un point d'accès WiFi avec un QR-code ===== | |
| <code bash> | |
| # Génère un QR-code | |
| qrencode -s 7 -l H -o Guest.Wifi.png 'WIFI:S:<SSID>;T:<WEP|WPA|blank>;P:<PASSWORD>;H:<true|false|blank>;;' | |
| |
| # Génère un QR-code avec icône au centre | |
| qrencode -s 7 -l H -o - 'WIFI:S:<SSID>;T:<WEP|WPA|blank>;P:<PASSWORD>;H:<true|false|blank>;;' | \ | |
| convert - -gravity center \ | |
| \( /usr/share/icons/Adwaita/64x64/status/network-wireless-signal-excellent-symbolic.symbolic.png -bordercolor white -border 10x10 -bordercolor black -border 5x5 \) \ | |
| -composite -trim -bordercolor white -border 10x10 -bordercolor black -border 1x1 wifi.png | |
| |
| # Génère un QR-code avec icône au centre ainsi que les informations en clair | |
| qrencode -s 7 -l H -o - 'WIFI:S:<SSID>;T:<WEP|WPA|blank>;P:<PASSWORD>;H:<true|false|blank>;;' | \ | |
| convert \( - -gravity center \( /usr/share/icons/Adwaita/64x64/status/network-wireless-signal-excellent-symbolic.symbolic.png \ | |
| -bordercolor white -border 10x10 -bordercolor black -border 5x5 \) -composite -trim -bordercolor white -border 10x10 \) \ | |
| \( -size 500x500 xc:white -font /usr/share/fonts/TTF/DejaVuSansMono.ttf -fill black -pointsize 16 -draw "text 0,16 'SSID: <SSID>'" \ | |
| -trim -bordercolor white -border 10x10 \) \( -size 500x500 xc:white -font /usr/share/fonts/TTF/DejaVuSansMono.ttf -fill black \ | |
| -pointsize 16 -draw "text 0,16 'PWD: <PASSWORD>'" -trim -bordercolor white -border 10x10 \) -gravity center -append -border color black -border 1x1 wifi.png | |
| </code> | |
| * ''S'' défini le SSID du réseau. | |
| * ''T'' défini le protocole de sécurité utilisé. | |
| * ''P'' défini le mot de passe. | |
| * ''H'' défini si le réseau est caché ou non. | |