感谢Chris的帮助,我编写了自己的脚本,可以检测我的手机是否在附近并锁定/解锁屏幕,如果设备仍然远离五秒后会超时。
这个脚本有点粗糙,但对我很有效 :)
#!/bin/bash
MAC=AA:BB:CC:DD:EE:FF
TIMEOUT=5
DEBUG=0
LASTSEEN=0
STATUS=0
PREVSTATUS=0
while true; do
DT="[$(date '+%F %T')]"
pgrep xscreensaver >/dev/null || xscreensaver -no-splash >/dev/null 2>&1 &
if [ -z "$RSSI" ]; then
sudo hcitool cc $MAC 2>/dev/null
fi
RSSI=$(sudo hcitool rssi $MAC 2>/dev/null | cut -d ' ' -f4)
[ $DEBUG -gt 0 ] && echo "$DT RSSI: $RSSI"
if [[ -n "$RSSI" && $RSSI -gt 0 ]]; then
LASTSEEN=$(date '+%s')
fi
if [[ $RSSI -eq 0 && $((`date '+%s'`-$LASTSEEN)) -gt $TIMEOUT ]]; then
STATUS=0
[ $DEBUG -gt 0 ] && echo "$DT Status: $STATUS Lastseen: $LASTSEEN Timeout: $((`date '+%s'`-$LASTSEEN))"
else
STATUS=1
[ $DEBUG -gt 0 ] && echo "$DT Status: $STATUS Lastseen: $LASTSEEN Timeout: $((`date '+%s'`-$LASTSEEN))"
fi
if [ $STATUS -ne $PREVSTATUS ]; then
PREVSTATUS=$STATUS
if [ $STATUS -gt 0 ]; then
[ $DEBUG -gt 0 ] && echo "$DT UnLock"
pgrep xscreensaver >/dev/null && xscreensaver-command -deactivate
xset dpms force on
pgrep xscreensaver >/dev/null && pkill xscreensaver
else
[ $DEBUG -gt 0 ] && echo "$DT Lock"
pgrep xscreensaver >/dev/null && xscreensaver-command -lock
fi
fi
[ $DEBUG -gt 0 ] && sleep 1
done
可能需要在 /etc/sudoers 中添加一行:
username ALL = NOPASSWD: /usr/bin/hcitool
也许这会对某些人有所帮助。
祝好!
=========================
更新于2017年9月26日!
我稍微更新了一下,并编写了一个Python脚本,通过DBus检测连接的蓝牙设备。因此,需要先配对蓝牙设备。
如果连接丢失,该脚本还会尝试重新连接到设备。这是因为有些设备不会自动重新连接(比如我的手机)。
但该脚本
不会读取RSSI信号强度,因为我的系统上的DBus没有报告它(不知道为什么)。
因为我使用Gnome,所以我将
org.gnome.ScreenSaver作为DBus接口来锁定屏幕。如果你在KDE或其他桌面环境中,你可能需要在代码中进行更改。
'''
bluescreen -- Locks your screen
bluescreen is a little python script which locks your screen as long as a bluetooth device is disconnected.
It also unlocks the screen when you return.
It uses the DBus to check if the device is connected and it locks the screen through DBus message calls.
The script uses the first BT adapter found in the system, mainly "hci0". This might be incorrect on some systems.
If so, check the source code below and do the necessary changes.
@author: Evil2000
@copyright: 2017 Evil2000
@license: LGPL
@contact: evil.2000@web.de
@deffield updated: 26.09.2017
'''
import time
import dbus
from dbus.mainloop.glib import DBusGMainLoop
from gi.repository import GObject as gobject
from pprint import pprint
'''
Debug flag should be clear
1 = Verbose
2 = Debug
'''
DEBUG = 0
'''
The BT MAC address of the device to monitor
'''
MAC = "11:22:33:AA:BB:CC"
''' =================================================================================================================== '''
DEV_ID = MAC.replace(":", "_")
dbus_loop = DBusGMainLoop()
sysbus = dbus.SystemBus(mainloop=dbus_loop)
device = sysbus.get_object('org.bluez', "/org/bluez/hci0/dev_" + DEV_ID)
deviceConnected = device.Get("org.bluez.Device1", "Connected", dbus_interface='org.freedesktop.DBus.Properties')
if DEBUG > 1:
pprint(deviceConnected)
sesbus = dbus.SessionBus(mainloop=dbus_loop)
sSaver = sesbus.get_object('org.gnome.ScreenSaver', "/org/gnome/ScreenSaver")
def lockScreen():
if not sSaver.GetActive(dbus_interface='org.gnome.ScreenSaver'):
if DEBUG:
print("["+time.strftime('%Y-%m-%d %H:%M:%S')+"] Locking Screen")
sSaver.Lock(dbus_interface='org.gnome.ScreenSaver')
def tryConnect():
if not deviceConnected:
if DEBUG:
print("["+time.strftime('%Y-%m-%d %H:%M:%S')+"] Trying device reconnect")
device.Connect(dbus_interface='org.bluez.Device1')
return True
def cb(*args, **kwargs):
iface = args[0]
chgprop = args[1]
if DEBUG > 1:
pprint(iface)
pprint(chgprop)
if iface == "org.bluez.Device1" and "Connected" in chgprop:
if chgprop['Connected'] == True:
print("["+time.strftime('%Y-%m-%d %H:%M:%S')+"] connected")
deviceConnected = True
sSaver.SetActive(False, dbus_interface='org.gnome.ScreenSaver')
else:
print("["+time.strftime('%Y-%m-%d %H:%M:%S')+"] disconnected")
deviceConnected = False
lockScreen()
device.connect_to_signal("PropertiesChanged", cb, dbus_interface=None, interface_keyword='iface', member_keyword='member', path_keyword='path', sender_keyword="sender", destination_keyword="dest", message_keyword="message")
gobject.timeout_add_seconds(3, tryConnect)
loop = gobject.MainLoop()
loop.run()