
Quelques astuces diverses, quatorzième

Au delà de mon absence prolongée d’Octobre, cela faisait longtemps que je n’avais pas partagé de nouvelles bidouilles. Et c’est une fournée presque entièrement centrée sur le shell qui vous est présentée aujourd’hui. Avec un peu de Cinnamon dedans également, pas surprenant quand on découvre un nouvel environnement de bureau 🙂
Rsync sélectif
J’ai toujours eu du mal à sélectionner comme je le veux un type de fichier en particulier à synchroniser avec rsync, en particulier dans une grosse arborescence (plus de 300Go). J’ai finalement trouvé un moyen de filtrer les fichiers via find pour les passer à rsync :
1 |
find source -name "*.php" -print0 | rsync -av --files-from=- --from0 ./ ./destination/ |
Une fonction dmesg pour les anciennes distribs
Si je dis pas de conneries j’ai déjà partagé un script perl qui fait le taf (vérification faite c’est le cas). Un collègue de boulot m’a montré une fonction bash pour lancer du perl directement sans script à part :
1 2 3 4 5 6 7 |
dmesg_with_human_timestamps () { $(type -P dmesg) "$@" | perl -w -e 'use strict; my ($uptime) = do { local @ARGV="/proc/uptime";<>}; ($uptime) = ($uptime =~ /^(\d+)\./); foreach my $line (<>) { printf( ($line=~/^\[\s*(\d+)\.\d+\](.+)/) ? ( "[%s]%s\n", scalar localtime(time - $uptime + $1), $2 ) : $line ) }' } |
On peut ensuite coller un alias sur le dmesg original pour être peinard :
1 |
alias dmesg=dmesg_with_human_timestamps |
Stocker ses creds dans gitconfig quand pas de SSH
Au taf on a basculé le Gitlab sur le SSO, et l’on ne peut pas utiliser SSH (Gitlab sur cluster OpenShift), donc auth_basic « classique » HS, on a maintenant besoin d’utiliser les access token. Une fois le token créé via l’interface de Gitlab, il faut le sauvegarder dans la config de git :
1 2 |
git config --global credential.helper 'store --file ~/.git-credential' git credential-store --file ~/.git-credential store |
La deuxième commande vous permettra de taper ligne par ligne le contenu du fichier, il faudra valider deux lignes vides pour sauvegarder le fichier :
1 2 3 4 |
protocol=https host=git.domain.tld username=f.name password=myToken |
Grep forcer l’affichage du nom du fichier
Le contexte est un peu particulier, on me demande de chercher une adresse IP dans une arborescence de code monstrueuse par la taille, j’ai voulu limiter aux fichiers « *.php » via find mais j’avais pas les noms :
1 2 3 4 5 |
seboss666 ~ find . -name "*.php" -exec grep "<?php" {} \; <?php $ezcyp = 'ac142v_#9\'-ug*p3Hrx7mn08fsykolitbed';$hhvjzur = Array();... <?php <?php This page sets a max-age cache control for <?php echo $secs?> seconds. The header looks like this:<br> |
Pas pratique, car grep pense dans ce cadre qu’il est tout seul. Il suffit de tricher un peu au niveau de grep :
1 2 3 4 5 |
seboss666 ~ find . -name "*.php" -exec grep "<?php" {} /dev/null \; ./mal.php:<?php $ezcyp = 'ac142v_#9\'-ug*p3Hrx7mn08fsykolitbed';$hhvjzur = Array();... ./terraform-aws-labs/content-post.php:<?php ./dev/siege/html/cache-control.php:<?php ./dev/siege/html/cache-control.php:This page sets a max-age cache control for <?php echo $secs?> seconds. The header looks like this:<br> |
En rajoutant /dev/null, on fait croire à grep qu’on travaille sur plusieurs fichiers, donc il va afficher le nom du « vrai » fichier à chaque trouvaille.
Cinnamon et souris Bluetooth qui déconnecte tout le temps
Comme j’ai une prise USB en moins sur le nouveau laptop et que la souris que j’avais arrivait en fin de vie, j’ai investi dans une souris Bluetooth. Problème, le gestionnaire Bluetooth de Cinnamon n’est pas efficace, la souris ne se reconnecte pas en sortie de veille ou reboot (et même quand la souris se met en veille). J’ai du installer blueman (que j’utilisais sous XFCE), on supprime tout ce qui existe de la souris, on réassocie, la connexion Bluetooth est restaurée au resume (contournement trouvé sur le forum Manjaro).
Créer des dossiers temporaires au démarrage du système
J’ai rencontré un problème sur CentOS 7 avec un service qui tente de poser une socket dans un dossier qui n’existe plus après le reboot de la machine (le /run en tmpfs, mais le socket pas à la racine du dossier). Il existe un mécanisme qui permet via le dossier tmpfiles.d permet de s’en sortir en créant un fichier qui contient une ligne à ce format :
1 |
D /var/run/supervisor 0775 root root - |
Au démarrage de la machine, le dossier sera recréé et le service pourra démarrer correctement.
SSH, bastion, éviter le ProxyCommand
Si vous me suivez depuis un moment vous devez savoir configurer finement SSH : dans le ssh_config de l’utilisateur, j’ai un alias *.domain.tld qui définit un ProxyCommand, soit une commande pour rebondir sur une autre machine. Mais je devais accéder à une machine sur ce domaine sans passer par le bastion. La solution était simple finalement :
1 2 3 4 5 |
Host machine1.domain.tld ProxyCommand none Host *.domain.tld ProxyCommand ssh -F ~/.ssh/config-proxy rebond.domain.com nc %h %p |
Récupérer de l’espace disque gratuitement
Après un P2V, j’ai été prévenu que les partitions de la VM de destination n’étaient pas aussi généreuses que celles du physique d’origine. La raison, les blocs réservés dans ext4, sur une partition non système on peut réduire le pourcentage par défaut (voire même complètement désactiver si vous savez ce que vous faites pour éviter les cas de saturation de disque)
1 2 3 4 5 6 7 8 9 |
seboss666 ~ df -h /home Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur /dev/sda4 358G 133G 208G 39% /home seboss666 ~ sudo tune2fs -m1 /dev/sda4 tune2fs 1.44.4 (18-Aug-2018) Définition du pourcentage de blocs réservés à 1% (955536 blocs) seboss666 ~ df -h /home Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur /dev/sda4 358G 133G 223G 38% /home |
InfluxDB via curl
Lors d’une mise à jour de Gogs, j’ai découvert qu’ils exposaient des metrics via Prometheus. J’ai donc installé telegraf/influxdb sur mon cluster Swarm pour collecter et stocker les données. Pour vérifier que celles-ci sont bien lisibles, on peut interroger influxdb via curl :
1 |
curl -4 -s -G http://localhost:8086/query?db=telegraf --data-urlencode "q=SHOW series" | jq |
J’utilise jq pour que ça soit un peu plus lisible comme sortie json, je vous conseille de l’essayer c’est sympa 🙂
Debian 9.5 et bug d’auto-completion
Ce n’est pas moi qui ai été touché par le bug, mais Pierre-Marie, lors du déploiement de VM via un template fourni par le client. Quand il tente d’exploiter l’auto-complétion, le shell reste coincé pendant pas mal de secondes. Apparemment le bug a aussi été vu sous Ubuntu et il existe une méthode de correction qui est décrite sur ce bug.
systemd-timesyncd pour pallier au problème de Cinnamon
Sur mon installation, la synchronisation réseau du temps se désactive tout le temps, et le fait qu’elle ne fonctionne pas quand je l’active ne doit pas être étranger à ce phénomène. En cherchant une solution j’ai découvert un petit outil qui peut rendre bien des services, qui n’est juste qu’un client NTP contrairement aux autres ténors qu’on présente généralement : timesyncd
Vous modifiez le fichier /etc/systemd/timesyncd.conf pour y renseigner vos serveurs NTP, vous activez et démarrez le service, l’affaire est jouée :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ grep NTP /etc/systemd/timesyncd.conf NTP=0.arch.pool.ntp.org 1.arch.pool.ntp.org 2.arch.pool.ntp.org 3.arch.pool.ntp.org $ sudo systemctl enable systemd-timesyncd Created symlink /etc/systemd/system/dbus-org.freedesktop.timesync1.service → /usr/lib/systemd/system/systemd-timesyncd.service. Created symlink /etc/systemd/system/sysinit.target.wants/systemd-timesyncd.service → /usr/lib/systemd/system/systemd-timesyncd.service. $ sudo systemctl start systemd-timesyncd $ systemctl status systemd-timesyncd ● systemd-timesyncd.service - Network Time Synchronization Loaded: loaded (/usr/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2018-11-23 10:36:14 CET; 11min ago Docs: man:systemd-timesyncd.service(8) Main PID: 15381 (systemd-timesyn) Status: "Synchronized to time server 91.121.7.182:123 (0.arch.pool.ntp.org)." Tasks: 2 (limit: 4915) Memory: 1.5M CGroup: /system.slice/systemd-timesyncd.service └─15381 /usr/lib/systemd/systemd-timesyncd nov. 23 10:36:13 seboss666-tkp systemd[1]: Starting Network Time Synchronization... nov. 23 10:36:14 seboss666-tkp systemd[1]: Started Network Time Synchronization. nov. 23 10:36:14 seboss666-tkp systemd-timesyncd[15381]: request_name_destroy_callback n_ref=2 nov. 23 10:36:14 seboss666-tkp systemd-timesyncd[15381]: request_name_destroy_callback n_ref=1 nov. 23 10:38:09 seboss666-tkp systemd-timesyncd[15381]: Synchronized to time server 91.121.7.182:123 (0.arch.pool.ntp.org). |
Par contre, contrairement aux liens en vrac, je n’ai plus de stock du tout, donc le prochain épisode sortira « quand il sera prêt » #DebianStyle
Ta commande :
.
.
find . -name "*.php" -exec grep "<?php" {} /dev/null \;
.
.
peut se réécrire comme :
.
.
grep -r --include='*.php' '<?php' .
.
.
-r est le mode récursif et –include permet de filtrer les fichiers.
(PS : bizarre les blocs de codes qui sont au dessus du texte.)
Et si tu veux forcer l’affichage du nom des fichiers, l’option -H le fait. (Oui, j’ai dû parcourir la page man, mais il aurait été étonnant qu’elle n’y soit pas)
Salut Seb !
Plutôt que de faire une recherche grep *via* find, pourquoi ne pas utiliser la commande rgrep ?
Hello,
si c’est juste pour l’affichage de la sortie, pour influxdb l’api propose le paramètre pretty pour afficher du json plus lisible :
~~~~
curl -4 -s -G http://localhost:8086/query?db=telegraf&pretty=true –data-urlencode « q=SHOW series »
~~~~