Ajout de boutons dans un terminal linux

Ajout de boutons dans un terminal linux

Notes

dans une fenêtre terminal linux, ajout de bouton pour exécuter une commande

Plusieurs approches existent selon ce que tu veux obtenir.

Dans un terminal classique (TUI)

  • dialog / whiptail : menus, boutons Oui/Non, listes de choix, en shell pur. Pratique pour un petit lanceur de scripts.
  • fzf : menu de sélection fuzzy, très rapide à mettre en place (printf '%s\n' "sauvegarde" "mise à jour" | fzf), puis un case sur le choix.
  • gum (Charm) : boutons, menus, confirmations avec un rendu moderne, utilisable directement dans un script bash.
  • Textual (Python) ou Bubble Tea (Go) : si tu veux une vraie interface avec boutons cliquables à la souris, plusieurs panneaux, etc.
  • tmux / Midnight Commander / ranger : les raccourcis ou la barre de boutons (F1-F10 dans mc) servent aussi de « boutons » configurables.

Dans une fenêtre terminal graphique

  • Konsole (KDE) : possibilité d’ajouter des profils, des actions et une barre d’outils personnalisée, mais pas de vrais boutons de commande intégrés.
  • Tilix, Terminator : pas de boutons non plus, mais des raccourcis et des profils.
  • Zenity / yad / kdialog : tu lances une petite fenêtre avec des boutons depuis un script, qui exécute ensuite la commande.

Dans un terminal web

Si c’est pour ton terminal web local : une page HTML avec des boutons qui envoient une commande à ttyd, ou qui appellent un petit backend lançant le script en SSH, fonctionne bien. Avec ttyd, on peut aussi passer des arguments par URL pour lancer un script précis.

Cas simple pour démarrer

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
choix=$(whiptail --title "Actions" --menu "Que faire ?" 15 50 4 \
  1 "Mise à jour" \
  2 "Sauvegarde" \
  3 "Redémarrer le service" 3>&1 1>&2 2>&3)

case $choix in
  1) sudo apt update && sudo apt upgrade ;;
  2) ./sauvegarde.sh ;;
  3) sudo systemctl restart monservice ;;
esac

Dis-moi ce que tu veux faire exactement (terminal local, web, ou dans un script SSH existant) et je te propose la solution la plus adaptée.

Exemple la commande tmux send-keys -t build_chirpy_site "journalctl --user -u surveiller-media.service -f" C-m lance journalctl, je veux ajouter 2 boutons start stop dans cette fenêtre pour lancer ou arrêter le service surveiller-media

Ce n’est pas absurde : tmux n’a pas de vrais boutons, mais depuis la version 3.3 on peut rendre cliquables des zones de la barre d’état. Tu auras ainsi deux boutons START et STOP en bas de la fenêtre, et le journalctl -f du haut affichera directement le résultat.

Ajoute ce bloc dans ton script, juste avant # Afficher la session :

1
2
3
4
5
6
7
8
9
10
11
12
# Boutons cliquables dans la barre d'état (tmux >= 3.3)
tmux set -t build_chirpy_site mouse on
tmux set -t build_chirpy_site status-right-length 40
tmux set -t build_chirpy_site status-right \
  "#[range=user|svc-start,bg=green,fg=black] ▶ START #[norange default] #[range=user|svc-stop,bg=red,fg=white] ■ STOP #[norange default]"

# Clic sur un bouton -> commande systemctl ; sinon comportement par défaut (changer de fenêtre)
tmux bind -n MouseDown1Status if -F '#{==:#{mouse_status_range},svc-start}' \
  "run-shell -b 'systemctl --user start surveiller-media.service'" \
  "if -F '#{==:#{mouse_status_range},svc-stop}' \
     \"run-shell -b 'systemctl --user stop surveiller-media.service'\" \
     'select-window -t='"

Quelques remarques :

  • Vérifie ta version avec tmux -V : il faut 3.3 ou plus pour range=user et mouse_status_range.
  • Le bind est global au serveur tmux (pas par session), mais il ne réagit qu’aux ranges svc-start et svc-stop. Les autres sessions ne sont pas affectées.
  • mouse on change aussi la sélection de texte dans les panneaux : pour copier, maintiens Shift pendant la sélection.
  • Si tu préfères le clavier, ou en secours si la souris pose problème :
1
2
tmux bind -n F5 run-shell -b 'systemctl --user start surveiller-media.service'
tmux bind -n F6 run-shell -b 'systemctl --user stop surveiller-media.service'

Tu peux alors afficher F5 start | F6 stop dans status-right à la place des boutons.

Un petit point au passage : tes tmux split-window et tmux selectp n’ont pas de -t build_chirpy_site. Ça fonctionne tant que la session que tu viens de créer est la plus récente, mais en ajoutant -t build_chirpy_site tu évites toute ambiguïté si une autre session est active.

Script corrigé + bloc boutons cliquables

Voici le script complet corrigé, avec les boutons.

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
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/bash

SESSION="build_chirpy_site"
WIN="lxcTerm"
SVC="surveiller-media.service"

# On supprime la session si elle existe déjà
if tmux has-session -t "$SESSION" 2>/dev/null; then
    tmux kill-session -t "$SESSION"
fi

# Créer session + fenêtre
tmux new-session -d -s "$SESSION" -n "$WIN"

# Séparation en 2 panneaux (haut / bas)
# | 0 |
# |---|
# | 1 |
tmux split-window -v -l 50% -t "$SESSION:$WIN.0"

# Panneau HAUT : logs du service local
tmux send-keys -t "$SESSION:$WIN.0" "journalctl --user -u $SVC -f" C-m

# Panneau BAS : logs de chirpy sur vm105
tmux send-keys -t "$SESSION:$WIN.1" "/home/yann/scripts/ssh-manager.sh vm105 exe 'journalctl --user -u chirpy -f'" C-m

# Boutons cliquables dans la barre d'état (tmux >= 3.3)
tmux set -t "$SESSION" mouse on
tmux set -t "$SESSION" status-right-length 40
tmux set -t "$SESSION" status-right \
  "#[range=user|svc-start,bg=green,fg=black] ▶ START #[norange default] #[range=user|svc-stop,bg=red,fg=white] ■ STOP #[norange default]"

# Clic sur un bouton -> systemctl ; sinon comportement par défaut
tmux bind -n MouseDown1Status if -F '#{==:#{mouse_status_range},svc-start}' \
  "run-shell -b 'systemctl --user start $SVC'" \
  "if -F '#{==:#{mouse_status_range},svc-stop}' \
     \"run-shell -b 'systemctl --user stop $SVC'\" \
     'select-window -t='"

# Raccourcis clavier de secours
tmux bind -n F5 run-shell -b "systemctl --user start $SVC"
tmux bind -n F6 run-shell -b "systemctl --user stop $SVC"

# Afficher la session
tmux attach -t "$SESSION"

Ce qui a changé par rapport à ta version :

  • Test de session : tmux has-session remplace list-sessions | grep | wc -l, plus simple et sans faux positifs sur un nom proche.
  • Cibles explicites : chaque split-window, send-keys et set vise la session, la fenêtre ou le panneau voulu ($SESSION:$WIN.0 et .1). Le selectp n’est plus nécessaire.
  • -p 50 remplacé par -l 50% : -p est déprécié sur les tmux récents (3.1 et plus).
  • Variables pour le nom de session et de service, pratique si tu changes l’un des deux.
  • echo "fin fi" et les commentaires inutiles supprimés.
  • tmux a remplacé par tmux attach -t, équivalent mais plus lisible.

Le bind est global au serveur tmux, mais il ne réagit qu’aux deux ranges svc-start et svc-stop. Les F5/F6 le sont aussi : si tu utilises ces touches dans d’autres sessions tmux, retire ces deux lignes ou change de touches. Comme avant, mouse on oblige à maintenir Shift pour sélectionner du texte.

Sans doute compliqué d’avoir un pointeur souris sur le terminal?

Non, ça marche normalement sans rien de spécial : le pointeur est celui de ton environnement graphique, et c’est le terminal (xterm dans ton cas) qui transmet les clics à tmux sous forme de séquences d’échappement. C’est le principe du « mouse reporting » : xterm le supporte par défaut, et mouse on côté tmux suffit à l’activer. Ça fonctionne aussi à travers SSH, et dans un terminal web comme ttyd (xterm.js gère la souris).

Pour vérifier rapidement :

  1. tmux -V doit afficher 3.3 ou plus.
  2. Lance le script, puis clique sur une zone de la barre d’état : si le pointeur change de fenêtre ou de panneau ailleurs dans tmux, la souris est bien prise en compte.
  3. Clique sur START ou STOP et regarde le journalctl -f du haut réagir.

Si rien ne se passe :

  • Souris ignorée : dans xterm, un clic avec Shift enfoncé n’est pas transmis à tmux (c’est voulu, pour sélectionner du texte). Vérifie que tu ne le maintiens pas.
  • tmux trop ancien : avant 3.3, range=user n’existe pas, donc les boutons ne sont pas cliquables. Les raccourcis F5/F6 restent alors la solution.
  • Console texte pure (TTY, sans X) : là, il n’y a pas de pointeur par défaut. Il faudrait installer gpm, mais ce n’est sans doute pas ton cas puisque tu lances le tout dans une fenêtre xterm.

Si tu voulais dire autre chose, par exemple afficher un vrai curseur graphique dans le terminal, précise-moi le contexte et je t’oriente.

c’est plus afficher un vrai curseur graphique dans le terminal

Pas dans le terminal lui-même : le pointeur de souris est dessiné par le serveur graphique (X11/XWayland), jamais par xterm ni par tmux. tmux reçoit seulement des coordonnées de clic, il ne peut pas afficher de curseur ni de survol sur les boutons.

Ce qu’on peut régler, c’est l’apparence du pointeur quand il survole la fenêtre xterm :

Editeur de menu KDE: build_chirpy_site

1
2
3
4
# AVANT MODIF
-rv -geometry 300x20 -T build_chirpy_site -e /home/yann/scripts/build_chirpy_site.sh
# APRES MODIF
-rv -geometry 150x40+100+150 -T suivi_chirpy_site -xrm 'XTerm*pointerMode: 0' -xrm 'XTerm*pointerShape: left_ptr' -xrm 'XTerm*pointerColor: white' -xrm 'XTerm*pointerColorBackground: black' -e '/home/yann/scripts/suivi_chirpy_site.sh'

La ligne complète

1
2
3
4
5
6
xterm -rv -geometry 150x40+100+150 -T suivi_chirpy_site \
  -xrm 'XTerm*pointerMode: 0' \
  -xrm 'XTerm*pointerShape: left_ptr' \
  -xrm 'XTerm*pointerColor: white' \
  -xrm 'XTerm*pointerColorBackground: black' \
  -e '/home/yann/scripts/suivi_chirpy_site.sh'
  • pointerMode: 0 : le pointeur ne disparaît plus quand tu tapes au clavier (par défaut xterm le cache). C’est souvent la raison pour laquelle on a l’impression qu’il n’y en a pas.
  • pointerShape : par défaut xterm utilise un curseur en forme de « I » (xterm) ; left_ptr donne la flèche classique, hand2 une main.
  • pointerColor et pointerColorBackground : utiles avec -rv (fond sombre) si le pointeur se perd dans le décor.

Sous Wayland (KDE), xterm tourne via XWayland et peut afficher un autre thème de curseur que le reste du bureau. Si le pointeur paraît moche ou mal dimensionné, c’est le thème de curseur X qu’il faut régler.

Si tu veux de vrais boutons graphiques avec effet de survol, il faut sortir du terminal. Le plus simple est une petite fenêtre à côté avec yad :

1
2
3
4
yad --title="surveiller-media" --width=250 --center --buttons-layout=center \
  --button="▶ Start:systemctl --user start surveiller-media.service" \
  --button="■ Stop:systemctl --user stop surveiller-media.service" \
  --button="Fermer:0" &

À tester chez toi : normalement chaque bouton lance sa commande sans fermer la fenêtre. Tu pourrais ajouter cette ligne à la fin de ton script, avant tmux attach. Si tu veux un vrai survol dans une interface en mode texte, il faudrait passer par une application Textual (Python), mais c’est nettement plus lourd que les boutons de la barre d’état de tmux.