Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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... tongue

#!/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... tongue

lol lol lol

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

Watael a écrit :

- 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. tongue Mais on peut ajouter un élément dans ce sens.

Watael a écrit :

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 !?

Watael a écrit :

- 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" neutral
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 ! lol

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".

Hors ligne

#11 Le 10/11/2024, à 16:41

sputnick

Re : Script pour bloquer/débloquer son clavier usb

krodelabestiole a écrit :

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.

Hors 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 tongue)

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

krodelabestiole a écrit :

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