Ajout de boutons dans un terminal linux
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 uncasesur 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 pourrange=useretmouse_status_range. - Le
bindest global au serveur tmux (pas par session), mais il ne réagit qu’aux rangessvc-startetsvc-stop. Les autres sessions ne sont pas affectées. mouse onchange aussi la sélection de texte dans les panneaux : pour copier, maintiensShiftpendant 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-sessionremplacelist-sessions | grep | wc -l, plus simple et sans faux positifs sur un nom proche. - Cibles explicites : chaque
split-window,send-keysetsetvise la session, la fenêtre ou le panneau voulu ($SESSION:$WIN.0et.1). Leselectpn’est plus nécessaire. -p 50remplacé par-l 50%:-pest 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 aremplacé partmux 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 :
tmux -Vdoit afficher 3.3 ou plus.- 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.
- Clique sur START ou STOP et regarde le
journalctl -fdu haut réagir.
Si rien ne se passe :
- Souris ignorée : dans xterm, un clic avec
Shiftenfoncé 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=usern’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_ptrdonne la flèche classique,hand2une main.pointerColoretpointerColorBackground: 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.