
Quelques astuces diverses, quinzième

2019 ne fait pas exception aux années précédentes, tant qu’on se servira d’ordinateurs il y aura une foultitudes de petites astuces du quotidien qu’il sera toujours intéressant de découvrir et de partager, alors c’est parti !
De l’importance des options de dd
J’ai offert du SSD dans la famille à Noël cette année. Et j’ai fat le choix de cloner les disques d’origine pour pas me retaper des installations de Windows à la pelle. Pendant mes tests avec deux SSD, je suis surpris de la lenteur du transfert :
1 2 |
sudo dd if=/dev/sdb of=/dev/sdc status=progress 144581120 octets (145 MB, 138 MiB) copiés, 6 s, 24,1 MB/s |
En fouillant un peu sur le net, dd propose des options dont une en particulier m’a permis de bien bourrer le débit :
1 2 |
sudo dd if=/dev/sdb of=/dev/sdc bs=128K status=progress 2289303552 octets (2,3 GB, 2,1 GiB) copiés, 12 s, 191 MB/s |
Voilà, pour mes besoins ça a suffi, le vrai transfert lui devait durer plus d’une heure avec ces paramètres (correction, il a pris quasiment trois heures pour mon beau-frère, heureusement qu’on était au cinéma), et je suis certain qu’il y a des brutasses pour m’expliquer les formules de calcul pour maximiser encore plus les résultats.
VLC/Qt5 : souci d’échelle pour l’interface
La densité d’affichage a augmenté sur mon nouveau laptop par rapport à l’ancien (14″ Full HD au lieu de 15″ HD ready), ce qui amène des surprises. Des images valant mieux qu’un long discours :
On le voit, les contrôles sont énormes et je vous parle pas des menus. Et la mise à l’échelle d’une appli Qt dans un environnement GTK c’est pas encore ça. Fort heureusement on peut jouer sur ce comportement via une variable d’environnement, ici il faut la poser dans ~/.profile :
1 |
export QT_AUTO_SCREEN_SCALE_FACTOR=0 |
Vous pouvez recharger ensuite votre session, les applis Qt devraient maintenant avoir une meilleure tête. La preuve :
Lister les IPs bannies par fail2ban
fail2ban fait partie des outils que je vous recommande pour apporter une sécurité supplémentaire à votre serveur, en détectant des comportements à partir des journaux système. Pour avoir juste un petit résumé des IPs qu’il a banni, je suis tombé sur cette routine bien affreuse à lire mais tout à fait efficace :
1 |
fail2ban-client status | grep "Jail list:" | sed "s/ //g" | awk '{split($2,a,",");for(i in a) system("fail2ban-client status " a[i])}' | grep "Status\|IP list" |
Dans mon cas, j’ai découvert un abus de l’utilisation du data saver de Google, qui s’est donc retrouvé bloqué à l’entrée du serveur de mon client.
Exploiter X-Forwarded-For dans IIS
Oui c’est plutôt rare pour être signalé, mais lors de recherches liées à cet entête HTTP très utilisé dans des contextes de load-balancing et de proxyfication, je suis tombé sur cet article qui vous explique comment enregistrer et exploiter cet entête dans IIS, le serveur web phare des plateformes Microsoft Windows. Car on y met généralement l’adresse IP du visiteur.
Pour rappel même si c’est juridiquement un peu flou pour l’instant on est encore obligé de conserver des journaux web d’identification des visiteurs à des fins légales (par exemple en cas d’injure publique, menace de mort, harcèlement…). L’adresse IP du visiteur doit donc être enregistrée correctement.
Comprendre ce qui a merdé dans une requête MySQL
Lors de la mise en place d’une base mysql pour la gestion des utilisateurs de proftpd, on a coincé sur une requête qui vérifie si l’utilisateur est activé et pas expiré :
1 2 |
mysql> SELECT userid, passwd, uid, gid, homedir, shell FROM users WHERE (userid='user1') AND (((disabled!=1 and (NOW()<=expires or expires=-1)))) LIMIT 1; Empty set, 1 warning (0.00 sec) |
Y’a un warning, mais on a pas le détail du warning en question. Ben en fait pour récupérer ce warning c’est tout simple :
1 2 3 4 5 6 7 |
mysql> show warnings; +---------+------+--------------------------------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------------------------------+ | Warning | 1292 | Incorrect datetime value: '-1' for column 'expires' at row 1 | +---------+------+--------------------------------------------------------------+ 1 row in set (0.00 sec) |
Oui ça parait évident à certains mais je suis pas un expert MySQL/MariaDB non plus même si je me débrouille hein 😀
Réparer pip après l’installation d’azure-cli
Je suis en train d’apprendre à déployer des applis sur un cluster AKS (Azure Kubernetes Services). A l’installation de l’azure-cli via pip, toutes la connectivité HTTPS a été pétée :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
$ az aks install-cli Traceback (most recent call last): File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main "__main__", fname, loader, pkg_name) File "/usr/lib/python2.7/runpy.py", line 72, in _run_code exec code in run_globals File "/usr/local/lib/python2.7/dist-packages/azure/cli/__main__.py", line 32, in <module> az_cli = get_default_cli() File "/usr/local/lib/python2.7/dist-packages/azure/cli/core/__init__.py", line 515, in get_default_cli help_cls=AzCliHelp) File "/usr/local/lib/python2.7/dist-packages/azure/cli/core/__init__.py", line 60, in __init__ register_ids_argument(self) # global subscription must be registered first! File "/usr/local/lib/python2.7/dist-packages/azure/cli/core/commands/arm.py", line 180, in register_ids_argument from msrestazure.tools import parse_resource_id, is_valid_resource_id File "/usr/local/lib/python2.7/dist-packages/msrestazure/__init__.py", line 28, in <module> from .azure_configuration import AzureConfiguration File "/usr/local/lib/python2.7/dist-packages/msrestazure/azure_configuration.py", line 34, in <module> from msrest import Configuration File "/usr/local/lib/python2.7/dist-packages/msrest/__init__.py", line 28, in <module> from .configuration import Configuration File "/usr/local/lib/python2.7/dist-packages/msrest/configuration.py", line 37, in <module> from .pipeline import Pipeline File "/usr/local/lib/python2.7/dist-packages/msrest/pipeline/__init__.py", line 52, in <module> from requests.structures import CaseInsensitiveDict File "/usr/local/lib/python2.7/dist-packages/requests/__init__.py", line 84, in <module> from urllib3.contrib import pyopenssl File "/usr/local/lib/python2.7/dist-packages/urllib3/contrib/pyopenssl.py", line 46, in <module> import OpenSSL.SSL File "/usr/local/lib/python2.7/dist-packages/OpenSSL/__init__.py", line 8, in <module> from OpenSSL import crypto, SSL File "/usr/local/lib/python2.7/dist-packages/OpenSSL/SSL.py", line 194, in <module> if _lib.Cryptography_HAS_SSL_ST: AttributeError: 'module' object has no attribute 'Cryptography_HAS_SSL_ST' |
Pour réparer, c’est un peu dégueu mais ça fonctionne :
1 2 |
$ sudo rm -rf /usr/local/lib/python2.7/dist-packages/OpenSSL/ $ sudo apt install --reinstall python-openssl |
Honnêtement vu la quantité de paquets que déclenche l’installation d’azure-cli via pip, j’ai été découragé de chercher la vraie source. Évidemment adaptez le chemin d’installation du dossier OpenSSL à votre version de Python et/ou votre OS 🙂
Délester le trafic des bots, version Nginx
Denis a du prendre récemment des mesures sur son blog pour délester son hébergement de robots un peu méchants qui saturaient les ressources de sa machine. Mais il n’a fourni la directive que pour Apache. Si vous êtes sous Nginx, vous pouvez utiliser cette règle :
1 2 3 4 5 |
location / { if ($http_user_agent ~ ""(; |^|@|/|.)?(Ahrefs|Cliqz|Dot|linkfluence|MJ12|[mM]oreover|Nuzzel|[oO]wlin|Rewyer|rogerbot|semantic-visions|Semrush|Slack|[sS]ociallymap|Superfeedr|ubermetrics|YaK)([bB]ot)?(/| |-|.)?"") { rewrite ".*" /"https://feeds.feedburner.com/dsfc?format=xml" redirect; } } |
Je crois qu’on peut se passer du location, mais si vous avez déjà un location /
vous pouvez juste ajouter le « if » dedans 😉
Docker : réutiliser les volumes d’un container existant
La formulation peut être étrange, mais vous allez comprendre. J’ai enfin monté une copie de mon blog sur mon cluster Docker Swarm pour pouvoir faire mes essais de modifications et préparer le futur. Lors d’une migration de WordPress, un outil devenu vite incontournable est wp-cli, qui permet notamment du traitement de masse sur la base de données via la configuration du blog. Sur un hébergement classique on se met à la racine du WordPress et on lance la commande. Mais dans la configuration Docker, on a pas accès à la racine puisqu’elle est dans le container, la seule persistance qui reste est le wp-content.
Docker permet cependant d’exécuter un autre container à partir des données d’un container existant, et c’est parfait pour le cas de wp-cli pour simuler justement le lancement depuis le wordpress installé dans le container voisin. La syntaxe n’est pas évidente, mais elle sauve une vie :
1 |
docker run -it --rm --volumes-from <container-id> --network container:<container-id> wordpress:cli search-replace "://old.domain.tld" "://new.domain.tld" |
A exécuter sur le nœud qui exécute le container WordPress (si vous avez plusieurs containers, n’importe lequel conviendra). Et dans mon cas, je sais déjà que mon thème va me poser des problèmes pour le futur via des alertes PHP…
grep : concaténer plusieurs filtres d’exclusion ou d’inclusion de recherche
Récemment, j’ai tenté d’obtenir du sens et comparer un certain trafic de journaux web à une semaine d’intervalle. J’ai commencé à empiler les grep -v « blabla » |grep -v « blublu », facile pour itérer sur les exclusions, mais il y a plus lisible (et potentiellement plus rapide et moins consommateur) :
1 |
zcat access_log.20.gz |egrep -v ".css|.js|.jpg|.gif|.png|favicon.ico|POST" |wc -l |
egrep (qui permet de déclencher le mode expression régulière), et des pipes qui séparent les modèles à exclure. Évidemment vous pouvez procéder de même pour inclure des modèles à rechercher.
Twidere : récupérer les fonctionnalités de messages privés
L’application Twidere sur Android est sympathique, mais le développement a cessé depuis un peu plus d’un an. Entre temps, Twitter a fait le gros dégueulasse avec son API et j’ai découvert que les messages privés n’étaient plus mis à jour dans l’application. En fouillant les issues Github, j’ai trouvé une solution qui a fonctionné pour moi, à savoir modifier les clés d’API dans les paramètres (settings), réseau (icône en forme de terre), Avancé, Paramètres API par défaut :
1 2 |
Clé client (Consumer key) : 3nVuSoBZnx6U4vzUxf5w Mot de passe client (Consumer secret) : Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys |
Il faut ensuite supprimer le compte et se relogger dessus, et ça rétablit le service (les messages privés de groupe sont même dispos !). Si ça ne fonctionne pas pour vous, le problème vient peut-être de la clé, auquel cas d’autres sont disponibles sur cette page github.
Voilà, je suis content de cette fournée, elle ne concerne pas que de la ligne de commande, on couvre de l’application de bureau, de l’application Android, et même du Windows, comme quoi tout est possible 🙂
Super utile la commande fail2ban pour les IPs bannies sur les jails actifs ! Merci à toi 🙂
Salut, Merci pour les astuces 🙂 Quelques petits ajouts/corrections : –> De l’importance des options de dd Pour ton besoin précis, tu aurais gagné énormément de temps à utiliser partclone, ou clonezilla. Et si je peux aussi te conseiller un truc bien sympa pour monter les ISO (genre clonezilla) qui change la vie : http://iodd.kr/wordpress/product/iodd-2531/ (t’as aussi d’autres modèles, dont une avec chiffrement). –> grep : concaténer plusieurs filtres d’exclusion ou d’inclusion de recherche – je préfère utiliser ‘grep -E’ que ‘egrep’ – tu peux utiliser l’option ‘-c’ pour compter, ça t’évite un ‘wc -l’ – il faut échapper les… Lire la suite »