希望在用户不活动一分钟后断开网卡,其中不活动定义为没有鼠标单击或滚轮滚动。鼠标移动将被忽略,因此 xscreensaver 不适合,xautolock 也不适合。如何从命令行检测并区分鼠标事件?
答案1
根据 meuh 的说明,这个“屏幕保护程序”是如何完成的:
#!/bin/bash
evemu-record /dev/input/event2 |
stdbuf -oL egrep 'EV_KEY|REL_WHEEL' |
(
./network_saver.sh
)
其中network_saver.sh是这样的:
#!/bin/bash
WAIT=5
while [ 1 ]
do
echo Waiting for $WAIT seconds of mouse button inactivity
while read -t $WAIT line
do
echo -n .
done
echo; echo Disabling networking
nmcli n off
echo Waiting for a mouse button press
while read line
do
echo -n .
break;
done
echo; echo Enabling networking
nmcli n on
# Connect the main nic as soon as possible
nmcli conn up "Ethernet connection 1" >/dev/null
done
答案2
如果您不想编写程序来执行此操作,有几个程序可以显示鼠标事件。例如,evemu-record
在鼠标输入设备上,将以非常详细的输出显示每个按钮的按下、滚轮滚动和移动,例如(显示已编辑):
E: 0001 0111 0001 # EV_KEY / BTN_RIGHT 1
E: 0000 0000 0000 # ------------ SYN_REPORT (0) ---------- +552ms
E: 0002 0008 -001 # EV_REL / REL_WHEEL -1
E: 0000 0000 0000 # ------------ SYN_REPORT (0) ---------- +1016ms
E: 0002 0000 0001 # EV_REL / REL_X 1
E: 0002 0001 0003 # EV_REL / REL_Y 3
不带参数运行evemu-record
以列出输入设备。就我而言是
/dev/input/event5: Logitech USB Optical Mouse
然后你可以编写一个 bash shell 脚本,例如:
( pid=$BASHPID
evemu-record /dev/input/event5 |
stdbuf -oL egrep 'EV_KEY|REL_WHEEL' |
( while read -t 5 junk
do echo -n .
done
echo ok
kill -pipe $pid
)
)
这用于egrep
过滤除按钮和滚轮线之外的所有线,用于确保输出不被缓冲(尽管您的 grep 可能接受执行相同操作的stdbuf
选项)。 --line-buffered
while 循环读取每一行并回显“.”,但如果 5 秒内没有输入 ( -t 5
),循环就会停止。最后,kill
管道需要 a,否则管道将不会结束,直到检测到新事件并egrep
通过 SIGPIPE 结束。使用kill -pipe
发送 SIGPIPE 信号,这可以避免您从kill -hup
.(...)
需要外壳来获取外壳 ( $BASHPID
) 的进程 ID,该外壳不会杀死任何周围的外壳代码。
或者,您可以从 获取 PS/2 数据流/dev/input/mice
,但我不知道格式的完整细节。您可以使用以下命令查看 3 字节记录
od -v -An -w3 -tx1 /dev/input/mice