#1 Le 08/11/2024, à 20:14
- lynn
Script pour bloquer/débloquer son clavier usb
Bonjour,
Voici un petit script shell qui permet de bloquer/débloquer son clavier usb. J'ai récemment changé mon K800 pour un G512 et je n'ai plus le petit connecteur pour l'éteindre afin de le nettoyer... et comme je suis assez maniaque, ça m'embêtait bien !
L'utilisation est très simple. Il faut juste renseigner Le Vendor ID et le Product ID disponible avec la commande lsusb et s'assurer que zenity est disponible sur le système. Et oui, ça se lance en graphique ! Enfin, surtout pour réactiver son clavier...
#!/bin/sh
# Set keyboard vendor and product IDs via lsusb command
vendorId="046d" # ID du vendeur
productId="c33c" # ID du produit
# Search the dmesg logs for devices corresponding to the vendorId and productId
kbdId=$(awk '/'"$vendorId"'.*'"$productId"'/ {sub(/:$/, "", $5); print $5; exit}' /var/log/dmesg)
# Check if a device was found
if [ -z "$kbdId" ]
then
zenity --error \
--text="No USB keyboard found with the IDs provided in the logs"
exit 1
fi
# Show a window with two options
action=$(zenity --list \
--radiolist \
--title="USB keyboard management" \
--text="Choose an action:" \
--column=" " --column="Action" \
TRUE "Block Keyboard" FALSE "Unblock Keyboard")
if [ "$action" = "Block Keyboard" ]
then
# Disable the keyboard using its USB ID (via unbind)
echo "$kbdId" | sudo tee /sys/bus/usb/drivers/usb/unbind >/dev/null
zenity --info \
--text="The keyboard is disabled"
elif [ "$action" = "Unblock Keyboard" ]
then
# Reactivate the keyboard using its USB ID (via bind)
echo "$kbdId" | sudo tee /sys/bus/usb/drivers/usb/bind >/dev/null
zenity --info \
--text="The keyboard is reactivated"
else
exit 1
fi
Dernière modification par lynn (Le 08/11/2024, à 20:17)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#2 Le 08/11/2024, à 20:58
- Watael
Re : Script pour bloquer/débloquer son clavier usb
- les IDs devraient pouvoir être récupérés "programmatiquement". mais il faudra toujours lancé lsusb pour
- sur quelle version d'Ubuntu le script a-t-il été testé ?
Et oui, ça se lance en graphique ! Enfin, surtout pour réactiver son clavier...
tiens!? et dans le cas d'un "combo" keyboard/mouse ? la souris, elle, n'est pas désactivée ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 09/11/2024, à 04:38
- lynn
Re : Script pour bloquer/débloquer son clavier usb
- les IDs devraient pouvoir être récupérés "programmatiquement". mais il faudra toujours lancé lsusb pour
J'y ai songé mais bon, on ne change pas de clavier tous les jours. Mais on peut ajouter un élément dans ce sens.
tiens!? et dans le cas d'un "combo" keyboard/mouse ? la souris, elle, n'est pas désactivée ?
Pour le combo clavier/souris, avec un système type Logitech Unify, chaque appareil à son propre ID donc ça ne pose pas de problème. Pour les autres matériels, n'en ayant pas sous la main, je ne peux pas tester mais même en cas de combo, j'imagine qu'ils ont aussi leurs propres ID, sinon comment les différencier !?
- sur quelle version d'Ubuntu le script a-t-il été testé ?
C'est testé sur Ubuntu 24.04.1 et Plucky Puffin (Development Branch)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#4 Le 09/11/2024, à 05:14
- Watael
Re : Script pour bloquer/débloquer son clavier usb
si la souris n'a plus de batterie, il suffit de redémarrer le PC : l'écriture sous /sys/bus/... n'est pas pérenne entre les redémarrages, n'est-ce pas ?
nb: mon clavier+souris T'n'B n'a qu'une seule entrée dans lsusb.
l'un et l'autre peuvent éventuellement aussi fonctionner l'un sans l'autre avec le même "dongle usb"
ce n'est pas le clavier qui fait relais pour la souris.
Dernière modification par Watael (Le 09/11/2024, à 05:15)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 09/11/2024, à 05:30
- lynn
Re : Script pour bloquer/débloquer son clavier usb
Non, les infos envoyées dans /sys/bus/... ne résistent pas à un redémarrage du pc ou même une clôture de session... et heureusement !
Tu peux poster ta ligne de lsusb concernant ton clavier ?
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#6 Le 09/11/2024, à 13:51
- Watael
Re : Script pour bloquer/débloquer son clavier usb
Bus 002 Device 003: ID 062a:4101 MosArt Semiconductor Corp. Wireless Keyboard/Mouse
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 09/11/2024, à 16:36
- lynn
Re : Script pour bloquer/débloquer son clavier usb
Dans ton cas, je pense qu'il faudrait filtrer en utilisant la commande udevadm pour avoir d'avantage d'info et discriminer sur les numéros de série des appareils... mais je ne peux pas tester, n'ayant pas ce combo clavier/souris.
udevadm info --query=all --path=/sys/bus/usb/devices/???
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#8 Le 09/11/2024, à 17:18
- Watael
Re : Script pour bloquer/débloquer son clavier usb
je ne sais pas trop quoi chercher :
$ udevadm info --query=all --path=/sys/bus/usb/devices/2-1.4 | grep -i seri
E: ID_SERIAL=MOSART_Semi._2.4G_Keyboard_Mouse
E: ID_USB_SERIAL=MOSART_Semi._2.4G_Keyboard_Mouse
$ udevadm info --query=all --path=/sys/bus/usb/devices/2-1.4
P: /devices/pci0000:00/0000:00:1a.0/usb2/2-1/2-1.4
M: 2-1.4
R: 4
U: usb
T: usb_device
D: c 189:130
N: bus/usb/002/003
L: 0
V: usb
E: DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb2/2-1/2-1.4
E: SUBSYSTEM=usb
E: DEVNAME=/dev/bus/usb/002/003
E: DEVTYPE=usb_device
E: DRIVER=usb
E: PRODUCT=62a/4101/108
E: TYPE=0/0/0
E: BUSNUM=002
E: DEVNUM=003
E: MAJOR=189
E: MINOR=130
E: USEC_INITIALIZED=16775907
E: ID_BUS=usb
E: ID_MODEL=2.4G_Keyboard_Mouse
E: ID_MODEL_ENC=2.4G\x20Keyboard\x20Mouse
E: ID_MODEL_ID=4101
E: ID_SERIAL=MOSART_Semi._2.4G_Keyboard_Mouse
E: ID_VENDOR=MOSART_Semi.
E: ID_VENDOR_ENC=MOSART\x20Semi.
E: ID_VENDOR_ID=062a
E: ID_REVISION=0108
E: ID_USB_MODEL=2.4G_Keyboard_Mouse
E: ID_USB_MODEL_ENC=2.4G\x20Keyboard\x20Mouse
E: ID_USB_MODEL_ID=4101
E: ID_USB_SERIAL=MOSART_Semi._2.4G_Keyboard_Mouse
E: ID_USB_VENDOR=MOSART_Semi.
E: ID_USB_VENDOR_ENC=MOSART\x20Semi.
E: ID_USB_VENDOR_ID=062a
E: ID_USB_REVISION=0108
E: ID_USB_INTERFACES=:030101:030102:
E: ID_VENDOR_FROM_DATABASE=MosArt Semiconductor Corp.
E: ID_MODEL_FROM_DATABASE=Wireless Keyboard/Mouse
E: ID_PATH_WITH_USB_REVISION=pci-0000:00:1a.0-usbv2-0:1.4
E: ID_PATH=pci-0000:00:1a.0-usb-0:1.4
E: ID_PATH_TAG=pci-0000_00_1a_0-usb-0_1_4
E: ID_FOR_SEAT=usb-pci-0000_00_1a_0-usb-0_1_4
E: TAGS=:seat:
E: CURRENT_TAGS=:seat:
bloquer/débloquer son clavier usb [...] pour l'éteindre afin de le nettoyer
en fait, je me contente d'enlever la pile.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 10/11/2024, à 11:09
- lynn
Re : Script pour bloquer/débloquer son clavier usb
Une autre approche mais je ne peux toujours pas tester avec un combo :
#!/bin/bash
# ID tmpfile
id_file="/tmp/usb_device_id.cfg"
# Check if a keyboard has already been disabled and whose ID is saved
if [ -f "$id_file" ]
then
read -r usb_device_id < "$id_file"
else
# List of USB keyboards detected by their model name
keyboards=$(udevadm info -e | awk -v RS="" '/E: ID_BUS=usb/ && /E: ID_INPUT_KEYBOARD=1/' | \
awk '/E: ID_MODEL=/{for(i=1;i<=NF;i++) if($i ~ /ID_MODEL=/) print $i}' | cut -d'=' -f2 | sort | uniq)
if [ -z "$keyboards" ]
then
zenity --error \
--text="No USB keyboard detected."
exit 1
fi
if ! chosen_kbd=$(zenity --list \
--title="Keyboard choice" \
--text="Select the USB keyboard to manage:" \
--column="Keyboards detected" $keyboards)
then
zenity --error \
--text="Operation canceled. Exit."
exit 1
fi
# Retrieving event device related to selected keyboard
event_path=$(udevadm info -e | awk -v RS="" '/E: ID_INPUT_KEYBOARD=1/ && /E: ID_MODEL='"$chosen_kbd"'/' | \
awk '/N: input\/event/ {print $2}' | head -n 1)
if [ -z "$event_path" ]
then
zenity --error \
--text="Event device not found for: $chosen_kbd."
exit 1
fi
# Adding /dev/ in front to get the full path
event_path="/dev/$event_path"
# Extracting the parent USB path
usb_device=$(udevadm info --query=all --name="$event_path" | awk -F'=' '/DEVPATH/ {print $2}' | sed 's/input.*//')
# Verifying the existence of the parent USB path
if [ -z "$usb_device" ] || [ ! -d "/sys$usb_device" ]
then
zenity --error \
--text="USB device path not found for: $chosen_kbd."
exit 1
fi
# Extracting the device ID from the bus
usb_device_id=$(echo "$usb_device" | sed 's|.*/\([0-9]\+-[0-9.]\+\)/.*|\1|')
# Store the device ID in a dedicated file
echo "$usb_device_id" > "$id_file"
fi
# Request the action to be performed
action=$(zenity --list \
--title="Keyboard Management" \
--text="Selected keyboard: $chosen_kbd\nWhat do you want to do?" \
--radiolist \
--column="Choice" \
--column="Action" \
TRUE "Lock Keyboard" FALSE "Unlock Keyboard" FALSE "Quit")
# Perform the chosen action
case $action in
"Lock Keyboard")
if echo "$usb_device_id" | sudo tee /sys/bus/usb/drivers/usb/unbind > /dev/null
then
zenity --info \
--text="The keyboard has been disabled."
else
zenity --error \
--text="Error: Unable to lock the keyboard."
fi
;;
"Unlock Keyboard")
if echo "$usb_device_id" | sudo tee /sys/bus/usb/drivers/usb/bind > /dev/null
then
zenity --info \
--text="The keyboard has been unlocked."
rm -f "$id_file"
else
zenity --error \
--text="Error: Unable to unlock the keyboard. Please restart your session."
fi
;;
"Quit")
exit 0
;;
*)
zenity --error \
--text="Error: Unrecognized action. Please check your input."
exit 1
;;
esac
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#10 Le 10/11/2024, à 12:21
- krodelabestiole
Re : Script pour bloquer/débloquer son clavier usb
intéressant, merci !
j'en ai eu besoin récemment : il est aussi possible de désactiver l'alimentation de certains port USB "programmatiquement".
nouveau forum ubuntu-fr on en parle là : refonte du site / nouveau design
profil - sujets récurrents - sources du site
En ligne
#11 Le 10/11/2024, à 16:41
- sputnick
Re : Script pour bloquer/débloquer son clavier usb
intéressant, merci !
j'en ai eu besoin récemment : il est aussi possible de désactiver l'alimentation de certains port USB "programmatiquement".
Salut,
j'aurais besoin de désactiver l'USB complètement quand je suis sur batterie sur mon laptop, t'a une idée de comment faire?
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#12 Le 10/11/2024, à 17:27
- krodelabestiole
Re : Script pour bloquer/débloquer son clavier usb
tu peux jeter un œil à cette doc en anglais par ex. : https://www.baeldung.com/linux/control-usb-power-supply
mais ça ne te permettra pas d'économiser de l'énergie notablement par rapport à simplement débrancher les périphériques manuellement.
nouveau forum ubuntu-fr on en parle là : refonte du site / nouveau design
profil - sujets récurrents - sources du site
En ligne
#13 Le 10/11/2024, à 18:37
- Watael
Re : Script pour bloquer/débloquer son clavier usb
awk | awk c'est pas bon
awk | sed non plus
a priori, un seul awk devrait faire le job, ainsi que celui de cut | sort | uniq (sort | uniq que l'on peut raccourcir en sort -u )
il semble que udevadm peut déjà pas mal avancer le boulot :
keyboards=$(udevadm info -e --property-match='ID_BUS=usb' --property-match='ID_INPUT_KEYBOARD=1' | sed -n '/ID_MODEL=/{s/.*=//p}' | sort -u)
on doit pouvoir se débarrasser du sort -u en remplaçant sed par awk grâce à un tableau...
___
Edit :
keyboards=$(2>/dev/null udevadm info --value --query=property --property=ID_MODEL $(udevadm info -e --property-match='ID_BUS=usb' --property-match='ID_INPUT_KEYBOARD=1') | sort -u)
pour faire propre, il vaudrait peut-être mieux utiliser un tableau bash
readarray -t keyboards < <(2>/dev/null udevadm info --value --query=property --property=ID_MODEL $(udevadm info -e --property-match='ID_BUS=usb' --property-match='ID_INPUT_KEYBOARD=1') | sort -u)
[...]
event_path=$(udevadm info -e --property-match='ID_BUS=usb' --property-match='ID_INPUT_KEYBOARD=1' --property-match="$chosen_kbd" | grep ^N: | cut -d ' ' -f2 )
[...]
usb_device=$(udevadm info --query=property --name="$event_path" --property=DEVPATH --value | sed 's/input.*//') #mais, je ne comprends pas à quoi sert le sed; on pourrait tout de suite récupérer l'ID, non ?
Dernière modification par Watael (Le 10/11/2024, à 23:56)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#14 Le 13/11/2024, à 16:21
- sputnick
Re : Script pour bloquer/débloquer son clavier usb
tu peux jeter un œil à cette doc en anglais par ex. : https://www.baeldung.com/linux/control-usb-power-supply
mais ça ne te permettra pas d'économiser de l'énergie notablement par rapport à simplement débrancher les périphériques manuellement.
Trouvé, merci ChatGPT:
GRUB_CMDLINE_LINUX_DEFAULT="[...] usbcore.autosuspend=1"
Ça m'économise un max de watts!
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne