Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

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 14/08/2020, à 12:03

jlfh0816

lanceur pour retirer sans risque une clé usb

Bonjour,

Une amie dont le PC est récemment passé de Windows à Xubuntu 18.04 m’a demandé s’il était possible de lui créer un lanceur qui, en cliquant dessus, lui permettrait  de « retirer sans crainte une clé usb ». En gros, elle souhaite disposer du même raccourci qui existe dans le monde Windows, en bas à droite dans la barre des taches.
Je ne suis pas du tout informaticien mais, en cherchant un peu sur la toile, j’ai trouvé deux scripts en bash qui permettent de créer un tel lanceur. Je les ai seulement un tout petit peu modifés pour les mettre un peu plus à mon goût.
Voici ma source pour le script n°1 et celle pour le script n°2.

Cependant, ces scripts ne fonctionnent pas tout à fait comme je le souhaite car :
- le script n°1 ne fonctionne que s’il y a seulement une seule clé usb connectée (voir le message de notification affiché ci-dessous). Avec 2 clés ou plus, il ne fonctionne plus du tout. C’est dommage, c’est celui que je préfère car le plus facile à comprendre pour un néophyte ...
1597403424.png

- le script n°2 fonctionne quel que soit le nombre de clés connectées mais les messages de notification qu’il émet ne sont pas pratiques car, d’une part, ils désignent les clés par leur dénomination /dev/sdX au lieu de leur « drivelabel » (leur étiquette?) et, d’autre part, il sont trop bavards, affichant un message de notification pour chaque partition démontée.
Ainsi, dans le cas où il y a 2 clés usb à retirer, il affiche un premier message pour sdb, un second pour sdb1, un troisième pour sdc et un quatrième pour sdc1. Je préférerai qu’il n’affiche qu’un seul message par clé voire même un message commun pour les deux clés :
1597403452.png

Du coup, je sollicite votre aide bienveillante : les défauts de ces deux scripts sont-ils corrigibles ?
Je vous remercie bien vivement par avance ! smile

Voici le script n°1 :

#!/bin/bash
#source du script :
#https://linuxnorth.wordpress.com/2018/01/25/safely-removing-a-usb-drive-with-a-bash-script/

# d'abord s'assurer que toutes les écritures en cours sur la clef USB sont terminées
echo "Flushing USB drive buffer"
sync
echo "sync complete"

# identifier le nom de la clef USB
usblongname=$(lsblk -l | grep /media/$USER/*)
echo $usblongname
usbname="${usblongname:0:4}"
echo $usbname

# démonter la clé USB
udisksctl unmount -b /dev/$usbname
echo "unmount complete"

# couper l'alimentation électrique de la clef USB
udisksctl power-off -b /dev/$usbname
echo "power off complete"

# afficher un message de notification autorisant le retrait de la clef USB
notify-send -t 5000 'clé USB' 'vous pouvez maintenant retirer sans crainte votre clé USB' --icon=$HOME/.scripts/clef.png

exit

et le script n°2 :

#!/bin/bash
#source du script :
#https://unix.stackexchange.com/questions/43594/umount-all-attached-usb-disks-with-a-single-command

command_exists () {
    type "$1" &> /dev/null
}

CMD=""

if command_exists udevadm; then
        CMD="$(which udevadm) info -q all -n"
fi

if command_exists udevinfo; then
        CMD="$(which udevinfo) -q all -n"
fi

echo "The udevinfo command for this system is $CMD"


for disk in /dev/sd*
do

        DISK=$($CMD $disk | grep ID_BUS)
        if [[ "$DISK" == *usb ]]; then
                echo "Flushing USB drive buffer"
                sync
                echo "sync complete"
                umount $disk && udisksctl power-off -b $disk
                echo "la clef usb $disk est maintenant démontée et n'est plus alimentée en courant"
# afficher un message de notification autorisant le retrait de la clef USB
notify-send -t 5000 "$disk" 'vous pouvez maintenant retirer sans crainte votre clé USB' --icon=$HOME/.scripts/clef.png
        fi
done
exit

Dernière modification par jlfh0816 (Le 14/08/2020, à 12:04)


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#2 Le 14/08/2020, à 13:37

toitoinebzh

Re : lanceur pour retirer sans risque une clé usb

salut

j'ai lu en diagonale ton message ...
pourquoi tu n'utilises pas le "clic droit sur la clef > démonter la clef" qui est déjà inclus dans xubuntu ?

Hors ligne

#3 Le 14/08/2020, à 15:32

inbox

Re : lanceur pour retirer sans risque une clé usb

Salut,

Pour Xubuntu, il existe des plugins à ajouter au tableau de bord. Certains sont installés et une partie est active dans le tableau de bord. Pour activer d'autres plugins : clic droit => Tableau de bord => Ajouter de nouveaux éléments. Reste à faire son choix dans la liste.

Certains plugins ne sont pas installés. Il faut les installer soit même. Dans le cas présent, c'est le paquet xfce4-mount-plugin qu'il faut installer. Ensuite, l'ajouter au tableau de bord.

Pour que l'utilisation de xfce4-mount-plugin soit plus claire, il faut, via clic droit => propriétés :
1/ cocher "Afficher un message après le démontage"
2/ dans "Systèmes de fichiers", cocher "Afficher uniquement les points de montage"
3/ Si souhaité, cocher "Exclure les systèmes de fichiers spécifiés" et ajouter / et /home

Ainsi configuré, n’apparaîtrons plus que les supports externes branchés : cartes SD, clefs USB, disques USB.

Pour éjecter un support, il suffit de cliquer sur l'icône du tableau de bord puis sur la ligne correspondant au support à éjecter.

A+


Un problème résolu ? Indiquez le en modifiant le titre du sujet.
Linux user 449594

Hors ligne

#4 Le 14/08/2020, à 16:47

jlfh0816

Re : lanceur pour retirer sans risque une clé usb

@toitoibzh
Merci d'avoir pris la peine de me répondre.
En fait, je connais très bien la méthode du démontage par le clic D > démonter mais ... le lanceur ne m'est pas destiné. Il est destiné à une personne qui fait l'effort de passer à Xubuntu et qui peine à se défaire de ses repères sur Windows. Pour l'instant, ça ne lui parait pas si naturel que ça de penser à ouvrir son gestionnaire de fichiers (Nemo), de repérer le nom de la clef dans le panneau de gauche et seulement à ce moment de faire clic D sur la clé pour finalement cliquer sur le sous-menu "enlever sans risque".
Mais sinon, je suis d'accord avec toi, une fois que l'on a mémorisé et accepté ce long (tout est relatif, on est d'accord !) cheminement, c'est la méthode de base (d'ailleurs, c'est la mienne au quotidien !).

@Inbox
Super ce plugin, je ne le connaissais pas du tout. Je l'ai installé et, effectivement, c'est d'un comportement très voisin de celui de l'icone "usb" dans la barre des taches de Windows. Pour moi, c'est adopté et je le garde dans mon propre tableau de bord. Maintenant, va falloir que je montre et emporte l'adhésion de mon amie. J'espère que ça le fera car ce plugin est bien pratique à l'usage si on clarifie bien les exclusions dans ses propriétés de façon à ne faire apparaître que les lecteurs extérieurs.
Merci de m'avoir fait découvrir ce plugin bien peu connu ! smile
Le seul petit inconvénient que je lui ai trouvé, c'est que le message de notification est du type zenity et pas du type notify-send : je le trouve moins esthétique. Mais des goûts et des couleurs ...

Dernière modification par jlfh0816 (Le 14/08/2020, à 16:55)


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#5 Le 14/08/2020, à 19:15

toitoinebzh

Re : lanceur pour retirer sans risque une clé usb

Mais sinon, je suis d'accord avec toi, une fois que l'on a mémorisé et accepté ce long (tout est relatif, on est d'accord !) cheminement, c'est la méthode de base (d'ailleurs, c'est la mienne au quotidien !).

pas besoin de passer par le gestionnaire de fichier, tu peux le faire directement sur l’icône de la clef usb sur le bureau

Hors ligne

#6 Le 15/08/2020, à 14:52

jlfh0816

Re : lanceur pour retirer sans risque une clé usb

@toitoinebzh
Oui, c'est vrai, tu as raison. Mais, dans mon cas particulier, je ne peux appliquer cette technique car j'ai fait le choix délibéré de n'avoir aucune icône sur le bureau. Ceci expliquant cela... !


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#7 Le 17/08/2020, à 18:07

kamaris

Re : lanceur pour retirer sans risque une clé usb

Je me suis amusé à compléter le premier script, à peu près sur la base de ce que tu demandais je pense :

#!/bin/bash

ICON_PATH="$(realpath "$(dirname "$0")")/umount_usb.png"
test -f "$ICON_PATH" || ICON_PATH=''

power_off()
{
  local model=$(lsblk -no model "$2" | tr '_' ' ')
  if udisksctl power-off -b "$2"; then
    [[ $1 == @('-v'|'--verbose') ]] && notify-send "$model" \
      "Vous pouvez maintenant retirer sans crainte votre clé USB" \
      --icon="$ICON_PATH"
    return 0
  else
    notify-send "$model" "La mise hors tension de la clé USB a échoué" \
      --icon="$ICON_PATH"
    return 1
  fi
}

declare -i unmounted=1 success=1
while read -r volume; do
  current_device=${volume%[0-9]*}
  if [[ $last_device != @($current_device|'') ]]; then
    ((unmounted)) && { power_off "$1" "$last_device" || success=0; }
    unmounted=1
  fi
  last_device=$current_device

  sync
  if ! udisksctl unmount -b "$volume"; then
    unmounted=0
    success=0
    notify-send "$volume" "Le volume n'a pas pu être démonté" --icon="$ICON_PATH"
  fi
done < <(lsblk -no path,hotplug,mountpoint | awk '$2 && $3{print $1}')

if [ -n "$last_device" ]; then
  ((unmounted)) && { power_off "$1" "$last_device" || success=0; }
else
  notify-send "$0" 'Aucune clé USB ne semble être utilisée' --icon="$ICON_PATH"
  exit 0
fi

if ((success)); then
  [[ $1 != @('-v'|'--verbose') ]] && notify-send \
    "$0" 'Vous pouvez maintenant retirer sans crainte vos clés USB' \
    --icon="$ICON_PATH"
  exit 0
else
  exit 1
fi

Pour les notifications, le script cherche une icône nommée umount_usb.png dans le répertoire où il se trouve (ça peut-être changé en entrée de script), et si il ne la trouve pas, il n'en utilise pas (en exploitant la possibilité de passer un chemin vide à notify-send).

Il y a une option -v ou --verbose, qui fera afficher une notification pour la mise hors tension de chaque clé en cas de succès, sinon il n'y a qu'une notification globale.
Les notifications en cas d'échec (de démontage ou de mise hors tension) sont faites pour chaque cas, indépendamment de cette option.

Dernière modification par kamaris (Le 18/08/2020, à 02:01)

Hors ligne

#8 Le 17/08/2020, à 18:45

jlfh0816

Re : lanceur pour retirer sans risque une clé usb

@kamaris

Tout d'abord, merci de t'être penché sur mon premier script et surtout un grand merci d'avoir travaillé à une ré-écriture aussi large !

J'ai testé ta proposition et je n'arrive pas à faire fonctionner ton script. Voici le message d'erreur qui s'affiche :

jlfh0816 @ Voyager1804  ~/.scripts
└─ $ ▶ ./kamaris.sh
lsblk: colonne inconnue : path,hotplug,mountpoint

Et, pour être complet, voici le message de notification qui s'affiche :

1597687305.png

Y a-t-il une commande particulière pour lancer ton script ? J'ai essayé avec l'option -v et ça me donne le même échec, sans plus de commentaires :

jlfh0816 @ Voyager1804  ~/.scripts
└─ $ ▶ ./kamaris.sh -v
lsblk: colonne inconnue : path,hotplug,mountpoint

Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#9 Le 17/08/2020, à 19:09

kamaris

Re : lanceur pour retirer sans risque une clé usb

Grrr… problème de version de lsblk j'ai l'impression.
Peux-tu donner le retour de

lsblk --version

et

lsblk --help

Dernière modification par kamaris (Le 17/08/2020, à 19:10)

Hors ligne

#10 Le 17/08/2020, à 19:44

MicP

Re : lanceur pour retirer sans risque une clé usb

Bonsoir

Je n'ai pas de version 18.04 d'Xubuntu installée pour tester,
mais peut-être simplement en les mettant en majuscule :
Donc, tester avec :

lsblk -no PATH,HOTPLUG,MOUNTPOINT

Retour utilisable de commande
2.d  Le prompt final : - permet de s'assurer que la commande est allée à son terme,- permet de s'assurer que la réponse du système n'est pas coupée à la fin,- et fournit parfois d'autres informations, détaillées dans le message #42

En ligne

#11 Le 17/08/2020, à 19:58

jlfh0816

Re : lanceur pour retirer sans risque une clé usb

@kamaris
Oui, bien sûr. Voici :

jlfh0816 @ Voyager1804  ~
└─ $ ▶ lsblk --version
lsblk de util-linux 2.31.1

et 

jlfh0816 @ Voyager1804  ~
└─ $ ▶ lsblk --help

Utilisation :
 lsblk [options] [<périphérique> ...]

Afficher des renseignements sur des périphériques blocs.

Options :
 -a, --all            afficher tous les périphériques
 -b, --bytes          afficher la TAILLE en octet plutôt qu'en format lisible
 -d, --nodeps         n'afficher ni les esclaves ni les porteurs
 -D, --discard        afficher les capacités d'abandon
 -z, --zoned           afficher le modèle de zone
 -e, --exclude <liste> exclure les périphériques par numéro majeur
                        (disques RAM par défaut)
 -f, --fs             afficher des renseignements sur les systèmes de fichiers
 -i, --ascii          utiliser seulement des caractères ASCII
 -I, --include <liste> ne montrer que les périphériques avec les numéros
                        majeur indiqués
 -J, --json           utiliser le format de sortie JSON
 -l, --list           utiliser l'affichage au format liste
 -T, --tree           use tree format output
 -m, --perms          afficher des renseignements sur les droits
 -n, --noheadings     ne pas afficher les en-têtes
 -o, --output <liste> colonnes affichées
 -O, --output-all     afficher toutes les colonnes
 -p, --paths          afficher le chemin de périphérique complet
 -P, --pairs          utiliser le format de sortie clef="valeur"
 -r, --raw            utiliser le format de sortie brut
 -s, --inverse        inverser les dépendances
 -S, --scsi           afficher les informations sur les périphériques SCSI
 -t, --topology       afficher des renseignements sur la topologie
 -x, --sort <colonne>  trier la sortie par <colonne>

 -h, --help           display this help
 -V, --version        display version

Available output columns:
        NAME  nom du périphérique
       KNAME  nom du périphérique interne du noyau
     MAJ:MIN  numéro majeur:mineur du périphérique
      FSTYPE  type de système de fichiers
  MOUNTPOINT  où le périphérique est monté
       LABEL  étiquette du système de fichiers
        UUID  UUID du système de fichiers
    PARTTYPE  type de partition UUID
   PARTLABEL  étiquette de partition
    PARTUUID  UUID de partition
   PARTFLAGS  indicateurs de la partition
          RA  avance en lecture (« readahead ») du périphérique
          RO  périphérique en lecture seule
          RM  périphérique amovible
     HOTPLUG  périphérique amovible ou connectable à chaud (USB, PCMCIA, etc.)
       MODEL  identifiant de périphérique
      SERIAL  numéro de série du disque
        SIZE  taille du périphérique
       STATE  état du périphérique
       OWNER  nom d'utilisateur
       GROUP  nom de groupe
        MODE  permissions de nœud de périphérique
   ALIGNMENT  index d'alignement
      MIN-IO  taille minimale d'E/S
      OPT-IO  taille optimale d'E/S
     PHY-SEC  taille de secteur physique
     LOG-SEC  taille de secteur logique
        ROTA  périphérique tournant
       SCHED  ordonnanceur d'E/S
     RQ-SIZE  demande de taille de la file
        TYPE  type de périphérique
    DISC-ALN  abandon de l'index d'alignement
   DISC-GRAN  abandon de la granularité
    DISC-MAX  abandon du maximum d'octets
   DISC-ZERO  abandon des données de zéros
       WSAME  écriture du même maximum d'octets
         WWN  identifiant de stockage unique
        RAND  ajout d'aléa
      PKNAME  nom du périphérique parent interne du noyau
        HCTL  Hôte:Canal:Cible:Ulog pour SCSI
        TRAN  type de périphérique de transport
  SUBSYSTEMS  dédupliquer une chaîne de sous-systèmes
         REV  révision de périphérique
      VENDOR  constructeur du périphérique
       ZONED  zone model

Consultez lsblk(8) pour obtenir des précisions complémentaires.

@MicP
Voici la réponse que j'obtiens :

jlfh0816 @ Voyager1804  ~
└─ $ ▶ lsblk -no PATH,HOTPLUG,MOUNTPOINT
lsblk: colonne inconnue : PATH,HOTPLUG,MOUNTPOINT

Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#12 Le 17/08/2020, à 20:39

MicP

Re : lanceur pour retirer sans risque une clé usb

Mais pourquoi tant de haine………POURQUOAAAAAAAAHHH !!! lol lol lol

Dernière modification par MicP (Le 17/08/2020, à 20:39)


Retour utilisable de commande
2.d  Le prompt final : - permet de s'assurer que la commande est allée à son terme,- permet de s'assurer que la réponse du système n'est pas coupée à la fin,- et fournit parfois d'autres informations, détaillées dans le message #42

En ligne

#13 Le 17/08/2020, à 21:15

kamaris

Re : lanceur pour retirer sans risque une clé usb

Ça va, c'est pas la colonne la plus importante qui te manque (ouf ! big_smile).
Voilà une mise à jour qui devrait faire l'affaire :

#!/bin/bash

ICON_PATH="$(realpath "$(dirname "$0")")/umount_usb.png"
test -f "$ICON_PATH" || ICON_PATH=''

power_off()
{
  local model=$(lsblk -no model "$2" | tr '_' ' ')
  if udisksctl power-off -b "$2"; then
    [[ $1 == @('-v'|'--verbose') ]] && notify-send "$model" \
      "Vous pouvez maintenant retirer sans crainte votre clé USB" \
      --icon="$ICON_PATH"
    return 0
  else
    notify-send "$model" "La mise hors tension de la clé USB a échoué" \
      --icon="$ICON_PATH"
    return 1
  fi
}

declare -i unmounted=1 success=1
while read -r volume; do
  current_device=${volume%[0-9]*}
  if [[ $last_device != @($current_device|'') ]]; then
    ((unmounted)) && { power_off "$1" "$last_device" || success=0; }
    unmounted=1
  fi
  last_device=$current_device

  sync
  if ! udisksctl unmount -b "$volume"; then
    unmounted=0
    success=0
    notify-send "$volume" "Le volume n'a pas pu être démonté" --icon="$ICON_PATH"
  fi
done < <(lsblk -npo name,hotplug,mountpoint -x name | awk '$2 && $3{print $1}')

if [ -n "$last_device" ]; then
  ((unmounted)) && { power_off "$1" "$last_device" || success=0; }
else
  notify-send "$0" 'Aucune clé USB ne semble être utilisée' --icon="$ICON_PATH"
  exit 0
fi

if ((success)); then
  [[ $1 != @('-v'|'--verbose') ]] && notify-send \
    "$0" 'Vous pouvez maintenant retirer sans crainte vos clés USB' \
    --icon="$ICON_PATH"
  exit 0
else
  exit 1
fi

Dernière modification par kamaris (Le 18/08/2020, à 02:00)

Hors ligne

#14 Le 17/08/2020, à 22:16

jlfh0816

Re : lanceur pour retirer sans risque une clé usb

@kamaris

Ouah, ça fonctionne super bien !
Je n'ai eu aucun échec de démontage des 5 clefs usb testées.

Avec 1 seule clé usb insérée, voici ce que me dit le terminal :

jlfh0816 @ Voyager1804  ~/.scripts
└─ $ ▶ ./kamaris.sh
Unmounted /dev/sdb1.

avec ce message de notification :

1597699320.png

Sans aucune clé insérée, voici ce que me dit le terminal :

jlfh0816 @ Voyager1804  ~/.scripts
└─ $ ▶ ./kamaris.sh
jlfh0816 @ Voyager1804  ~/.scripts
└─ $ ▶ 

en affichant ce message de notification :

1597699291.png

Et enfin, avec 2 clés usb insérées, voici ce qu'affiche le terminal :

jlfh0816 @ Voyager1804  ~/.scripts
└─ $ ▶ ./kamaris.sh
Unmounted /dev/sdb1.
Unmounted /dev/sdc1.

avec ce message de notification correspondant :

1597699320.png

Donc, succès sur toute la ligne : un très grand merci kamaris, ton script est 100% fonctionnel !  big_smile


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#15 Le 18/08/2020, à 01:55

kamaris

Re : lanceur pour retirer sans risque une clé usb

En bonus, gestion des conteneurs chiffrés LUKS :

#!/bin/bash

ICON_PATH="$(realpath "$(dirname "$0")")/umount_usb.png"
test -f "$ICON_PATH" || ICON_PATH=''

power_off()
{
  local model=$(lsblk -no model "$2" | tr '_' ' ')
  if udisksctl power-off -b "$2"; then
    [[ $1 == @('-v'|'--verbose') ]] && notify-send "$model" \
      "Vous pouvez maintenant retirer sans crainte votre clé USB" \
      --icon="$ICON_PATH"
    return 0
  else
    notify-send "$model" "La mise hors tension de la clé USB a échoué" \
      --icon="$ICON_PATH"
    return 1
  fi
}

declare -i unmounted=1 success=1
while read volume pvolume; do
  test -n "$pvolume" && current_device=${pvolume%[0-9]*} || current_device=$volume
  if [[ $last_device != @($current_device|'') ]]; then
    ((unmounted)) && { power_off "$1" "$last_device" || success=0; }
    unmounted=1
  fi
  last_device=$current_device

  sync
  if ! udisksctl unmount -b "$volume"; then
    unmounted=0
    success=0
    notify-send "$volume" "Le volume n'a pas pu être démonté" --icon="$ICON_PATH"
  fi
  if [[ ${volume##*/} != ${current_device##*/}* ]] \
    && ! udisksctl lock -b "$pvolume"; then
    unmounted=0
    success=0
    notify-send "$pvolume" "Le conteneur LUKS n'a pas pu être verrouillé" \
      --icon="$ICON_PATH"
  fi
done < <(lsblk -Ppno kname,pkname,hotplug,mountpoint \
         | awk '{for (i=1;i<=NF;i++) gsub("[^\"]+=\"|\"","",$i)}
                (+$3 || p) && $4{print $1" "$2; p=0; next}
                +$3 && $2{p=1; next} {p=0}')

if [ -n "$last_device" ]; then
  ((unmounted)) && { power_off "$1" "$last_device" || success=0; }
else
  notify-send "$0" 'Aucune clé USB ne semble être utilisée' --icon="$ICON_PATH"
  exit 0
fi

if ((success)); then
  [[ $1 != @('-v'|'--verbose') ]] && notify-send \
    "$0" 'Vous pouvez maintenant retirer sans crainte vos clés USB' \
    --icon="$ICON_PATH"
  exit 0
else
  exit 1
fi

Dernière modification par kamaris (Le 18/08/2020, à 01:56)

Hors ligne

#16 Le 18/08/2020, à 10:52

jlfh0816

Re : lanceur pour retirer sans risque une clé usb

@kamaris

Merci mille fois de ton travail, je t'en suis très reconnaissant.
Je n'utilise pas de conteneurs chiffrés LUKS (et pour être honnête, je ne sais même ce que c'est ... voilà une très bonne occasion de me pencher sur la doc !) et, du coup, je n'ai pas pu tester la nouvelle version de ton script concernant ce point précis. Par contre, cette nouvelle version est pleinement fonctionnelle avec les clés usb sans conteneurs LUKS, ça au moins j'ai pu le tester !
Encore merci kamaris smile


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#17 Le 18/08/2020, à 11:03

kamaris

Re : lanceur pour retirer sans risque une clé usb

De rien, c'était avec plaisir wink
N'hésite pas à poster si tu l'utilises et que ça bugue, ou qu'il manque quelque chose…

Hors ligne

#18 Le 18/08/2020, à 11:52

jlfh0816

Re : lanceur pour retirer sans risque une clé usb

Hier, pendant que kamaris "planchait" sur son super script, je m'amusais de mon côté à essayer de modifier mon premier script afin que le message de notification envoyé par notify-send affiche le nom (l'étiquette ? le label ? ...) de la clef retirée avec si possible une police, une taille et une couleur qui "saute" aux yeux.
Oh, ça n'apporte pas grand'chose, c'est du cosmétique, c'était juste un exercice de style pour voir si c'était possible ou pas. Rien de plus. Et bien entendu, rappel du post #1, ce script ne fonctionne que s'il y a une seule clé usb à retirer ...
Et voilà ce que ça a donné selon que la clé retirée a un nom personnalisé (donc un "label" ou une "étiquette", à gauche) ou non (donc, affichage de l'UUID en lieu et place du "label", à droite) :

                                                                                                                 1597748204.png    1597748236.png

Et voici le script correspondant :

#!/bin/bash
#https://linuxnorth.wordpress.com/2018/01/25/safely-removing-a-usb-drive-with-a-bash-script/

# d'abord s'assurer que toutes les écritures en cours sur la clf USB sont terminées
echo "Flushing USB drive buffer"
sync
echo "sync complete"

# identifier le nom de la clef USB
usblongname=$(lsblk -l | grep /media/$USER/*)
echo $usblongname
usbname="${usblongname:0:4}"
echo $usbname

# sauvegarder le nom de la clef USB et le mettre en forme
echo $usblongname | awk -F "/" '{print $4}' > message.txt
var="$(<message.txt)"
echo $var
message="<span color='#57dafd' font='26px'><i><b>$var</b></i></span>"

# démonter la clé USB
udisksctl unmount -b /dev/$usbname
echo "unmount complete"

# couper l'alimentation électrique de la clef USB
udisksctl power-off -b /dev/$usbname
echo "power off complete"

# afficher un message de notification autorisant le retrait de la clef USB
notify-send -t 5000 'clé USB' "vous pouvez maintenant retirer sans crainte votre clé  $message" --icon=$HOME/.scripts/clef.png
exit

Mais bon, tout ça c'était avant que kamaris publie son super script que je retiens en priorité, le sien au moins fonctionne sur plusieurs clés usb et c'est nettement plus solide que mes petites bidouilles dans mon coin !

Dernière modification par jlfh0816 (Le 18/08/2020, à 15:40)


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#19 Le 18/08/2020, à 12:23

kamaris

Re : lanceur pour retirer sans risque une clé usb

Je ne sais pas si tu as vu, j'utilise un nom de clé pour le notify-send dans la fonction power_off() de mon script : c'est le champ MODEL de lsblk.
Mais à l'usage, ça n'apparaitra que si le script est lancé avec l'option -v ou --verbose, ou si la mise hors tension échoue.
Et je ne fais pas de mise en forme : je le mets simplement en « summary » dans notify-send.

Rq : pour récupérer plus simplement le nom de clé que tu utilises :

var=${usblongname##*/}

Hors ligne

#20 Le 18/08/2020, à 14:20

jlfh0816

Re : lanceur pour retirer sans risque une clé usb

@kamaris

Merci beaucoup pour ces précisions !
Je ne suis pas du tout scripteur (je ne fais que m'inspirer des travaux des autres) mais je suis toujours ravi de pouvoir apprendre et, en l'occurence, c'est vraiment gentil à toi de m'avoir fait part de ces remarques.
A la lumière de celles-ci, je vais tranquillement m'y remettre et voir si je peux faire de la mise en forme des messages de notification de notify-send dans ton script.
Je posterai dès que j'aurai quelques chose de présentable et surtout de fonctionnel.
C'est vrai que tout ça n'est que la cosmétique mais ça fait plaisir à mon côté bling bling !

Encore merci kamaris de ta disponibilité et de ta bienveillance !  smile


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#21 Le 18/08/2020, à 14:45

jlfh0816

Re : lanceur pour retirer sans risque une clé usb

@kamaris

kamaris a écrit :

Rq : pour récupérer plus simplement le nom de clé que tu utilises :

var=${usblongname##*/}

Je viens d'utiliser ton astuce pour définir la variable $VAR et ça fonctionne de façon impeccable : merci !!!  tongue


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#22 Le 24/08/2020, à 10:19

jlfh0816

Re : lanceur pour retirer sans risque une clé usb

kamaris a écrit :

Je ne sais pas si tu as vu, j'utilise un nom de clé pour le notify-send dans la fonction power_off() de mon script : c'est le champ MODEL de lsblk.

Bonjour kamaris,
Dans un petit script d'essai autour de ton travail, j'ai vainement essayé de définir une variable $model en partant de la ligne de script que tu as eu la gentillesse d'écrire (post #13).
J'ai notamment essayé :

model=$(lsblk -no model "$2" | tr '_' ' ')

mais, lorsque je l'introduis ensuite dans la ligne de commande de notify-send en écrivant :

model=$(lsblk -no model "$2")
notify-send "summary"  -t 10000 '$model'

, j'ai ce message d'erreur :

jlfh0816 @ Voyager1804  ~/.scripts
└─ $ ▶ ./essai.sh
lsblk:  : n'est pas un périphérique bloc

Est-ce que tu pourrais me dire comment définir $model de telle sorte que je puisse ensuite l'utilser dans la ligne de commande de notify-send ?
Ou alors faut-il impérativement définir $model à l'intérieur d'une fonction power off () comme tu l'as fait dans ton script ?
Ou alors est-ce lsblk qui ne peut être appelé comme je le fais ?

Je te remercie par avance de ton aide !

Dernière modification par jlfh0816 (Le 24/08/2020, à 10:23)


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#23 Le 24/08/2020, à 11:07

MicP

Re : lanceur pour retirer sans risque une clé usb

@jlfh0816

Dans ton script, la variable $2 n'est sans doute pas définie,
ce qui entraîne l’apparition du message d'erreur :

lsblk:  : n'est pas un périphérique bloc

Remplace $2 par exemple par : /dev/sda :

model=$(lsblk -no model /dev/sda)
notify-send "summary"  -t 10000 "$model"

Dernière modification par MicP (Le 24/08/2020, à 11:08)


Retour utilisable de commande
2.d  Le prompt final : - permet de s'assurer que la commande est allée à son terme,- permet de s'assurer que la réponse du système n'est pas coupée à la fin,- et fournit parfois d'autres informations, détaillées dans le message #42

En ligne

#24 Le 24/08/2020, à 11:49

jlfh0816

Re : lanceur pour retirer sans risque une clé usb

Merci beaucoup MicP de ta réponse.
J'ai donc remplacé $2 par /dev/sdb mais ça ne supprime pas le message d'erreur relatif à lsblk :

jlfh0816 @ Voyager1804  ~/.scripts
└─ $ ▶ ./essai.sh
lsblk: /dev/sdb : n'est pas un périphérique bloc

Le message de notification qui s'affiche malgré tout montre que le body est constitué par l'expression littérale de $model :

1598266881.png

Même résultat en mettant sdb1 au lieu de sdb.

Je suis retourné voir le script de kamaris et je ne vois pas trop à quel endroit $2 est définie ?

Autre chose : lorsque dans mon script j'ajoute un

echo $model

rien ne s'affiche dans le terminal ...

Dernière modification par jlfh0816 (Le 24/08/2020, à 13:45)


Xubuntu - Voyager 18.04 et 22.04

Hors ligne

#25 Le 24/08/2020, à 22:33

kamaris

Re : lanceur pour retirer sans risque une clé usb

Il faut passer à lsblk un nom de périphérique valide.
Pour voir tes noms de périphériques, regarde le retour de lsblk dans le terminal (première colonne).

Dans mon script, le $2 (second argument) de la fonction power_off() correspond à $last_device dans le corps le script, car j'appelle la fonction par

power_off "$1" "$last_device"

$1 est le premier argument du script (l'option éventuelle -v), également passé en premier argument à power_off().

Ton corps de message contient littéralement $model au lieu de sa valeur, car tu as utilisé des guillemets simples au lieu des doubles :

notify-send "summary"  -t 10000 '$model'

au lieu de

notify-send "summary"  -t 10000 "$model"

Hors ligne