#26 Le 26/02/2023, à 14:06
- lynn
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
Certains irréductibles n'utilisent pas systemd...
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#27 Le 26/02/2023, à 14:07
- Tawal
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
Oui, mais ton spectre s'est élargi tout de même
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
En ligne
#28 Le 26/02/2023, à 14:15
- lynn
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
*correction du jour --> j'avais omis '1' à la commande sleep
echo "power on" | bluetoothctl # on active le bluetooth
sleep
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#29 Le 26/02/2023, à 14:16
- Watael
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
Oui, mais ton spectre s'est élargi tout de même
ou, le champ des possibles s'est rétréci.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#30 Le 26/02/2023, à 14:20
- Watael
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
on peut faire
bluetoothctl <<<'power on'
?
ou simplement
bluetoothctl power on
???
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#31 Le 26/02/2023, à 14:26
- lynn
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
C'est exact, on peut faire plus simple avec
bluetoothctl power on
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#32 Le 26/02/2023, à 14:36
- lynn
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
Même chose pour 'connect'
bluetooth connect $mac
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#33 Le 26/02/2023, à 15:21
- Watael
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
isScreenLocked() {
sessionIDs=( $(loginctl list-sessions --no-legend | cut -d ' '-f1) )
for id in ${sessionIDs[@]} #<est-il vraiment nécessaire de vérifier tous les utilisateurs connectés ?
do
readarray -t < <(loginctl show-session $id --value -p Name -p User -p State -p Type -p Remote -p LockedHint)
read user name remote type state locked < <(printf '%s ' "${MAPFILE[@]}")
done
[[ $remote == no && $state == active && $type == @(x11|wayland) && $locked == no ]] #<d'autant que seules les dernières assignations seront disponibles !
}
Dernière modification par Watael (Le 26/02/2023, à 15:22)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#34 Le 26/02/2023, à 15:29
- lynn
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
est-il vraiment nécessaire de vérifier tous les utilisateurs connectés ?
En fait non, juste l'utilisateur de la session en cours.
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#35 Le 26/02/2023, à 15:37
- lynn
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
Il y a un oubli d'espace dans ta commande entre ' ' et -f1
--no-legend | cut -d ' '-f1)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#36 Le 26/02/2023, à 15:43
- Watael
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
donc :
isScreenLocked() {
readarray -t properties < <(loginctl show-session $XDG_SESSION_ID --value -p State -p Type -p Remote -p LockedHint)
read remote type state locked < <(printf '%s ' "${properties[@]}") #<c'est juste pour avoir des noms; on pourrait utiliser ${properties[0]} à la place de $remote dans le test suivant
[[ $remote == no && $state == active && $type == @(x11|wayland) && $locked == no ]]
}
Dernière modification par Watael (Le 26/02/2023, à 15:45)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#37 Le 26/02/2023, à 15:52
- lynn
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
C'est normal que sur mon système, cette commande ne me renvoie rien ?
echo $XDG_SESSION_ID
Par contre
loginctl list-sessions --no-legend | cut -d ' ' -f1
me renvoie '2'
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#38 Le 26/02/2023, à 16:04
- Watael
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
je ne sais pas.
pour être tranquille :
isScreenLocked() {
local XDG_SESSION_ID=${XDG_SESSION_ID:-$(loginctl list-sessions --no-legend | awk -v user=$LOGNAME '$3==user{print $1}')}
...
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#39 Le 26/02/2023, à 16:45
- lynn
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
Merci pour ton aide précieuse. J'ai édité le premier message pour intégrer les changements.
Sinon tu utilises quoi comme environnement parce que chez moi, la variable XDG_SESSION_ID n'existe que sous un TTY...
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#40 Le 26/02/2023, à 16:58
- Watael
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
je démarre spectrwm avec startx, en effet.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#41 Le 26/02/2023, à 17:17
- lynn
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
Ah oui en effet ! C'est du lourd, enfin pas vraiment mais quand même.
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#42 Le 27/02/2023, à 11:14
- k3c
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
@lynn
merci pour ton script
c'est étonnant qu'il n'y ait pas depuis longtemps un soft "approuvé/officiel" qui fasse ça, c'est tellement pratique.
Debian 12 sur Thinkpad reconditionné
Hors ligne
#43 Le 27/02/2023, à 14:00
- lynn
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
@k3c
Merci pour ton retour.
c'est étonnant qu'il n'y ait pas depuis longtemps un soft "approuvé/officiel" qui fasse ça, c'est tellement pratique.
Logiquement, quand tu t'éloignes de ton pc, tu verrouilles ta session donc ce script n'a pas une utilité fondamentale. Je cherchais juste un système qui permette de palier un possible défaut de sécurisation de la session, ce dernier se situant entre la chaise et le clavier. ^^
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#44 Le 27/02/2023, à 15:07
- Watael
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
Je cherchais juste un système qui permette de palier un possible défaut de sécurisation de la session, ce dernier se situant entre la chaise et le clavier.
autant je pourrais le croire pour une montre connectée que je n'enlèverais que pour dormir, autant pour un portable que je laisse souvent à côté du clavier quand je vais boire un café, j'y crois moyen.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#45 Le 27/02/2023, à 15:13
- Watael
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
voici quelques suggestions et quelques questions :
#!/bin/bash
# Informations à remplir par l'utilisateur
mac="XX:XX:XX:XX:XX:XX"
device_name="Le Nom du Smartphone"
seconds2lock="Nombre de secondes"
# ne rien modifier en-dessous de cette ligne.
TZ=UTC printf -v notify_time '%(%H heure(s) %M minute(s) %S seconde(s))T' $seconds2lock
notify="notify-send -i phone -u critical --hint=int:transient:1"
max_iterations=5
iterations=0
isPCbt() {
case $1 in
planeMode) rfkill list | grep -qow "Soft blocked: yes"
;;
powered) bluetoothctl show | grep -qw "Powered: yes"
;;
*) exit 1
;;
esac
}
isPhone() {
case $1 in
paired|connected) bluetoothctl info $mac | grep -qw "${1^}: yes"
;;
*) exit 1
;;
esac
}
isScreenLocked() {
local XDG_SESSION_ID=${XDG_SESSION_ID:-$(loginctl list-sessions --no-legend | awk -v user=$LOGNAME '$3==user{print $1}')}
readarray -t properties < <(loginctl show-session $XDG_SESSION_ID --value -p State -p Type -p Remote -p LockedHint)
read remote type state locked < <(printf '%s ' "${properties[0]}")
[[ $remote == no && $state == active && $type == @(x11|wayland) && $locked == no ]]
}
while :
do sleep 2 #<Pour quoi faire ? et pourquoi au début ?
# si le mode avion pour le bluetooth est actif
if isPCbt planeMode
then
# on désactive le mode avion
rfkill unblock bluetooth
# sleep 1
until ! isPCbt planeMode; do sleep .1; done #<Inclure un nombre de tentatives pour exitOnFailed2much
# autre si le bluetooth n'est pas activé ( /!\ différent du mode avion /!\ )
elif ! isPCbt powered
then
# on active le bluetooth
bluetoothctl power on
# sleep 1
until isPCbt powered; do sleep .1; done #<Inclure un nombre de tentatives pour exitOnFailed2much
# autre si le smartphone n'est pas appairé
elif ! isPhone paired
then
# On appaire le smartphone ( /!\ partie intéractive à valider sur le smartphone et sur le PC /!\ )
bluetoothctl pair $mac
# sleep 1
until isPhone paired; do sleep .1; done #<Inclure un nombre de tentatives pour exitOnFailed2much
# autre si le bluetooth du pc est actif ET le smartphone est appairé ET non connecté
elif isPCbt powered && isPhone paired && ! isPhone connected
then
# connexion au smartphone
bluetoothctl connect $mac
# sleep 1
until isPhone connected; do sleep .1; done
((iterations++))
# tant qu' 'iterations' est supérieur ou égal à 'max_iterations' (5)
while ((iterations>=max_iterations))
do
# si l'écran n'est pas verrouillé
if ! isScreenLocked
then
# le temps restant est égal au temps avant verrouillage (300)
time_left=$seconds2lock
# bulle de notification
$notify "Le smartphone $device_name n'est pas connecté" "L'écran sera verrouillé dans :\n$notify_time"
# tant que le temps restant est plus grand que '0'
while ((time_left > 0))
do
# si le smartphone n'est pas connecté
if ! isPhone connected
then
sleep 1 #<Pourquoi ?
# à chaque itérations de la boucle, le temps restant sera égal au temps restant moins '1'
((time_left--))
# si l'écran est verrouillé pendant la progression du compte à rebours
if isScreenLocked
then
break
fi
else
break
fi
done
# si le smartphone n'est pas connecté et que l'écran n'est pas verrouillé
if ! isPhone connected && ! isScreenLocked
then
# on verrouille l'écran
loginctl lock-session
# si le smartphone est connecté et que l'écran est déverrouillé
elif isPhone connected && ! isScreenLocked
then
# bulle de notification
$notify "Le smartphone $device_name est connecté" "Le verrouillage de l'écran est annulé"
# la variable '$iterations' reprend comme valeur '0'
iterations=0
else
# la variable '$iterations' reprend comme valeur '0'
iterations=0
fi
else
# la variable '$iterations' reprend comme valeur '0'
iterations=0
break
fi
done
else
# la variable '$iterations' reprend comme valeur '0'
iterations=0
fi
done
je ne suis pas certain que tout fonctionne : je ne peux pas tester.
EDIT: remplacer tous les until... par un appel à la fonction exitOnFailed2much :
exitOnFailed2much() {
local n=0
if test "$1" = "not"
then
shift
until ! $@ || ((++n>10))
do
sleep .1
done
else
until $@ || ((++n>10))
do
sleep .1
done
fi
((n>=10)) && exit 1
}
par exemple : exitOnFailed2much not isPCbt planeMode, ou exitOnFailed2much isPCbt powered.
Dernière modification par Watael (Le 27/02/2023, à 15:48)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#46 Le 27/02/2023, à 16:36
- lynn
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
C'est l'habitude de mettre un sleep quelque chose quand je fais partir une boucle... c'est plus pratique pour arrêter en cas d'emballement du truc, un oubli, une erreur. Mais c'est vrai qu'on peut l'enlever. Pour les autres, dans le doute, je laisse un délai pour l'exécution des commandes mais ce n'est certainement pas nécessaire non plus...
Pour les exitOnFailed2much, pourquoi pas; mais dans ce cas, il n'y a pas besoin de délai. Dans le cas du mode avion, si la désactivation ne fonctionne pas, c'est peut-être qu'il n'y pas de service bluetooth qui tourne ou alors un admin en herbe a joué avec sa configuration.
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#47 Le 27/02/2023, à 19:29
- lynn
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
J'ai modifié le script dans le premier message en reprenant certains éléments de ce tu m'as proposé. Pour le exitOnFailed2much, je ne l'ai pas encore intégré. Pour en revenir au sleep, le premier après le while, en fait il est bien utile car ça évite de faire monter la charge du système de façon excessive.
Pour le deuxième sleep, il correspond au compte à rebours des 300 secondes... si on l'enlève, bah le temps passe beaucoup plus vite d'un coup... ^^
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#48 Le 27/02/2023, à 21:05
- Watael
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
je parlais bien du sleep 2 et des sleep 1.
mais pour le sleep 2, je ne comprends pas : "la montée en charge" n'est que repoussée, de deux secondes ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#49 Le 27/02/2023, à 21:19
- lynn
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
Note la différence dans ce graphe... Sur la partie de gauche, la charge normale est située entre 0 et 20% environ et une fois le sleep 1 enlevé, ça se situe entre 20 et 40% environ.
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#50 Le 27/02/2023, à 22:00
- Watael
Re : [ Script bash ] Verrouiller son écran en utilisant le bluetooth
il faut un temps de pause pour que la boucle infinie (while :) ne mouline pas, bien sûr.
de toute façon, quand tu auras inscrit le script dans la crontab (ou autre systemctl périodique), cette boucle infinie n'auras plus de raison d'être.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne