Terminal fish

Suite à l’annonce du portage de fish en rust, je me suis laissé tenter. C’est désormais tranché, je reste sur fish !

Première chose j’ai suivi le tutoriel et j’ai notamment lancé fish_config browse pour choisir mes couleurs et mon prompt.

Mon config.fish est très simple, je m’étais amusé à remplacer le « greeting » par des fortunes et notamment de les ré-afficher lors d’un clear screen :

❯ cat ~/.config/fish/config.fish
if status is-interactive
    # Commands to run in interactive sessions can go here
    bind \cl 'clear;fish_greeting;echo;commandline -f repaint'
end

À noter que la configuration est stockée sous ~/.config/fish/ contrairement aux ~/.*shrc.

On peut y placer des fonctions fish ou des snippets de configurations additionnels. Dont mon fish_greeting :

❯ cat functions/fish_greeting.fish
function fish_greeting
    fortune -asc /home/m8t/var/fortune/ /usr/share/fortune/ | sed '/^%$/d';
end

Il n’y a pas de commande built-in alias contrairement aux autres shell populaires, il y a cependant une fonction fish pour imiter les alias. On peut définir un alias tel quel : alias cal='cal -m3'. On peut aussi sauvegarder l’alias directement avec l’option --save : alias --save cal='cal -m3'. Et voilà, l’alias est disponible dans les nouvelles sessions.

Mais j’ai aussi eu l’occasion de découvrir abbr qui est une commande built-in de fish.

❯ cat conf.d/abbr.fish
abbr -a --set-cursor='%' -- nhc 'clush -b -f4 -w % nhc -a'
abbr -a -- brol 'tmux -L brol'

La saisie d’une commande abrégée validé par la touche Enter, étend automatiquement la ligne par la commande réelle et c’est exécuté. Mais il y a mieux, j’ai beaucoup apprécié l’option --set-cursor qui permet de taper dans son terminal la commande abrégée, de frapper la barre d’espace, et paf ! La ligne est remplacée par la vraie commande, et le curseur placé à la place du caractère %. Ne reste plus qu’à coller les arguments qui vont bien.

Dernière chose, je continue d’écrire mes scripts shell comme avant avec le shebang #!/bin/sh.

systemd-inhibit pour désactiver le reboot

Il peut arriver que l’on reboot par mégarde, il peut aussi arriver qu’un voisin reboot sans avoir vérifier au préalable si la machine pouvait être rebooté.

Avec systemd ça peut s’inhiber facilement.

La commande systemd-inhibit prend en paramètre une commande à exécuter, avec optionnellement la raison.

Par exemple :

$ systemd-inhibit --who m8t --why 'working inside tmux' waitpid 1

`waitpid 1` étant une commande qui ne quittera jamais, un équivalent est `sleep infinity`. Par conséquent, tant que la commande systemd-inhibit n’est pas arrêtée, le système sera immunisé au reboot par inadvertance.

L’état peut être visualisé :

$ systemd-inhibit --list
WHO UID USER PID COMM WHAT WHY MODE
m8t 1000 m8t 544449 systemd-inhibit shutdown:sleep:idle working inside tmux block

Et l’action vu en direct :

$ reboot                
Operation inhibited by "m8t" (PID 544449 "systemd-inhibit", user m8t), reason is "working inside tmux".
Please retry operation after closing inhibitors and logging out other users.
Alternatively, ignore inhibitors and users with 'systemctl reboot -i'.

uvc-kill-switch

Petit kill-switch pour la webcam:

$ cat uvcswitch.sh 
#!/bin/sh
lsmod | grep -q uvcvideo && sudo /sbin/rmmod -f uvcvideo || sudo /sbin/modprobe uvcvideo

netmask avec ipcalc

Retrouver le netmask au format qui va bien est fort pratique à l’aide de l’outil ipcalc :

$ ipcalc 10.1.2.0/22
Netmask: 255.255.252.0 = 22
HostMin: 10.1.0.1
HostMax: 10.1.3.254

Mais pour de l’ipv6 il faut un autre outil. Il existe ipv6calc, qui a bien trop d’options, et ne fait pas l’équivalent de ipcalc de base :

$ ipv6calc 2001:4002::/64
blablabla

Et l’aide est toute sauf intuitive :

$ ipv6calc --help
blablablablablabla

Il existe deux autres outils qui supportent ipv4 et ipv6 pour fournir des informations de bases d’un subnet (nermask, hostmax, hostmin, etc). Il s’agit de sipcalc et subnetcalc :

$ sipcalc 2001:4002::/64
Subnet prefix (masked) - 2001:4002:0:0:0:0:0:0/64
Network range - 2001:4002:0000:0000:0000:0000:0000:0000
- 2001:4002:0000:0000:ffff:ffff:ffff:ffff
$ subnetcalc 2001:4002::/64
Network = 2001:4002:: / 64
Host Range = { 2001:4002::1 - 2001:4002::ffff:ffff:ffff:ffff }

Masquer les champs de saisie dans XScreensaver

Parce que je voulais pas avoir le feedback sur le nombre de caractères saisie dans la boîte de dialogue de déverouillage XScreensaver, j’ai trouvé la seule manière de le faire via des paramètres X Resources.

Voici comment avoir un thème noir.

Ajoutez les lignes ci-dessous dans ~/.Xresources puis lancez la commande xrdb -merge ~/.Xresources, enfin assurez-vous de relancer xscreensaver.

!general dialog box (affects main hostname, username, password text)
xscreensaver.Dialog.foreground: #121212
xscreensaver.Dialog.background: #111111
xscreensaver.Dialog.topShadowColor: #111111
xscreensaver.Dialog.bottomShadowColor: #111111
xscreensaver.Dialog.Button.foreground: #666666
xscreensaver.Dialog.Button.background: #111111

!username/password input box and date text colour
xscreensaver.Dialog.text.foreground: #111111
xscreensaver.Dialog.text.background: #111111

!timeout bar (background is actually determined by Dialog.text.background)
xscreensaver.passwd.thermometer.foreground: #666666
xscreensaver.passwd.thermometer.background: #333333
xscreensaver.passwd.thermometer.width: 12

Voici le résultat :

curl peut résoudre des adresses personnalisées

L’option --resolve peut être bien utile :

curl -v https://mon-vhost/ --resolve mon-vhost:443:192.168.10.42

La commande curl ne passera pas par le résolveur du système, à la place mon-vhost sera automatiquement résolu par l’IP 192.168.10.42. L’option peut être réutilisée plusieurs fois dans la même commande.

Désactiver le curseur sous LightDM

Pour désactiver le curseur de la souris sous LightDM, modifiez la configuration /etc/lightdm/lightdm.conf. La clé xserver-command contient par défaut X, il suffit de modifier cela par la valeur X -nocursor :

xserver-command=X -nocursor

La souris est toutefois toujours active, le curseur est lui transparent. Pour désactiver les bulles d’aide de GTK+ placez la configuration suivante dans le fichier $HOME/.gtkrc-2.0 :

gtk-enable-tooltips=0

SSH keep-alive

Lorsque vous êtes dans une session SSH, et que vous n’êtes pas dans un screen, signifie que vous faites quelque chose de faux (si vous exécutez de longues tâches.)

Soit, vous avez besoin de garder la session active (même si vous êtes dans un screen.)

Du côté du client, utilisez ce paramètre :

ServerAliveInterval 300

Par exemple à l’intérieur de ~/.ssh/config/

Host missycraft
    Hostname pwet.domaine.ninja
    User root
    IdentityFile /home/user/.ssh/id_rsa_ninja
    ServerAliveInterval 300

Ceci garantie que même si vous n’intéragissez pas avec la session, un paquet est envoyé au serveur au bout de X secondes afin de ne pas perdre la connectivité.

Côté serveur, il est possible de définir le paramètre ClientAliveInterval, qui a exactement le même effet, envoyer au bout de X secondes un paquet au client.