마우스 움직임을 무시하면서 화면 보호기처럼 마우스 클릭을 감지하는 스크립트

마우스 움직임을 무시하면서 화면 보호기처럼 마우스 클릭을 감지하는 스크립트

1분 동안 사용자 활동이 없으면 네트워크 카드 연결을 끊고 싶습니다. 여기서 비활성은 마우스 클릭이나 휠 스크롤이 없는 것으로 정의됩니다. 마우스 움직임이 무시되므로 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 쉘 스크립트를 작성할 수 있습니다.

( 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-bufferedwhile 루프는 각 줄을 읽고 "."을 에코하지만 5초 이내에 입력( )이 없으면 -t 5루프가 중지됩니다. 마지막으로 kill파이프라인에는 a가 필요합니다. 그렇지 않으면 새 이벤트가 감지되어 egrepSIGPIPE를 통해 종료될 때까지 파이프라인이 종료되지 않습니다. kill -pipeSIGPIPE 신호를 사용 하면 shell()의 프로세스 ID를 얻기 위해 쉘이 kill -hup필요 하지 않으므로 주변 쉘 코드가 종료되지 않습니다.(...)$BASHPID

또는 에서 PS/2 데이터 스트림을 얻을 수 있지만 /dev/input/mice형식에 대한 자세한 내용은 모르겠습니다. 다음 명령을 사용하면 3바이트 레코드를 볼 수 있습니다.

od -v -An -w3 -tx1 /dev/input/mice

관련 정보