Ubuntu RFID 屏幕保护程序锁定-解锁

Ubuntu RFID 屏幕保护程序锁定-解锁

所以,我有这个 el-cheapo RFID 扫描仪和一些 RFID 标签。

我心里想,你知道什么会很棒吗?用这个东西启用和禁用锁定屏幕。

包裹到了之后我把它撕开并挂上。

这个设备模拟了一个 USB 键盘(这解释了他们所推崇的无驱动产品),本质上就是输入卡 ID 并按回车键。

我想我可以从 /dev/stdin(键盘记录器)打开一个恒定流并观察我想要的卡何时被打入。这就是促使我创建这个愚蠢的简单脚本的原因:

/bin/bash #!/bin/bash  

cat /dev/stdin | 读取行时  
  如果 [ “$line” == “0000996716” ]  
     然后回显“正确!”  
完毕  

有效!

然后我将 THEN 语句更改为 gnome-screensaver unlock 命令gnome-screensaver-command -d

然后手动锁定我的屏幕(Ctrl- Alt- L)刷了我的卡......什么都没有。扫描仪刚刚在密码字段中输入了卡号并按回车键,导致锁定屏幕上显示“密码不正确”。

于是我通过密码解锁了屏幕,发现终端屏幕上什么都没有。

于是我打开了直通管道/dev/stdin并锁定了屏幕。用密码解锁后... 什么都没有了。

为什么这不符合我的预期?不/dev/stdin包含锁定屏幕期间输入的信息?如果不包含,那包含什么?

答案1

好吧,你们太差劲了 :P 这有点具体和小众,但我不会因此而责怪你 ;)

无论如何,为了全面了解。

我买了这个小巧的装置,它像在原帖中一样被描述为“无驱动”。这意味着它就像一个 USB 键盘(并在 /dev/input/event* 中注册为 USB 键盘)。这对我来说几乎毫无用处,因为当锁屏处于活动状态时,我无法以任何方式与设备交互,我需要从设备读取按键,因为它们是由阅读器“输入”的。Cat-ing /dev/input/event3(我的阅读器)给了我垃圾,或者我是这么认为的。

然后我在这里遇到了这段代码:http://itech-planet.net/content/reading-device-input-directly-fromto-devinputeventx-ubuntu-c没有?我可以看到作者,但这个应用程序中大部分的功劳都归功于他/她。谢谢!简化此代码后,我能够从自己的键盘读取原始输入,密码短语为“secret”,然后继续将击键捕获到变量中,并查找何时按下“enter”以将字符串与代码的存储值进行对比。

此代码本质上是一个高级键盘记录器,指向不同的“键盘”,并扫描其“键入”的内容以匹配短语。就像 FBI 筛选来自一名 13 岁女孩的数百万条 AOL IM 以寻找恐怖分子一样!

当它找到匹配的短语时,它会触发 if 语句并运行其余相应的代码。我已尽我所能对其进行了评论,如果您有任何问题,请给我发电子邮件/私信/发信息/大声喊叫。

你不是在读这些,你只是想要代码!好吧,代码在这里!

用法:

sudo ./[文件] -u [你的用户名] -d [设备位置] -t [标签 ID]

因此,我,作为 Tyler,我的设备位于 /dev/input/event3,我的标签是 0000996716,我将具有:

sudo ./input -u tyler -d /dev/input/event3 -t 0000996716

代码:

#include <linux/input.h>  
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int getStatus(){
  FILE *fp;
  char path[128];
  fp = popen("sudo -u tyler gnome-screensaver-command -q", "r");

  fgets(path, sizeof(path)-1, fp);
  pclose(fp);
  printf("%s\n",path);
  if(strcmp("The screensaver is inactive\n",path)==0) 
    return 1;//if screensaver is disabled
  else if(strcmp("The screensaver is active\n",path)==0) 
    return 0;//if screensaver is enabled
  else
    return -1;//wat
}

int main(int argc, char **argv)
{
//char array that stores the keys in order up to like 40 something, DO NOT MESS WITH THE ORDER OF THIS ARRAY. ITS IMPORTANT.
    char arr[]={' ',' ','1','2','3','4','5','6','7','8','9','0','-','=','\b','\t','q','w','e','r','t','y','u','i','o','p','[',']','\n',' ','a','s','d','f','g','h','j','k','l',';',',','`',' ','\\','z','x','c','v','b','n','m',',','.','/',' ','*',' ',' '};
    char inp[256];//input string to check what you type.
    int fd;//file pointer to the /dev/input device
char usr[32];//stores your username to run screensaver command as you. Root user (sudo) can NOT lock the screen.
char tag[32];//stores the tag ID for the RFID
char dev[32];//stores the device location, /dev/input/eventX
char lcom[96];//locking command builder string
char ucom[96];//unlocking command builder string
//processes arguments, dont ask.
   int idx = 0;
   for (idx = 1; idx < argc;  idx++) {
       if (strcmp(argv[idx], "-u") == 0) {
      strcpy(usr,argv[idx+1]);
          printf("User = %s\n", usr);
       } else if (strcmp(argv[idx], "-t") == 0) {
      strcpy(tag,argv[idx+1]);
          printf("Tag = %s\n", tag);
       } else if (strcmp(argv[idx], "-d") == 0) {
      strcpy(dev,argv[idx+1]);
          printf("Device = %s\n", dev);
      fd = open(dev, O_RDONLY);
       } else {}
    }
    //build commands
    strcpy(lcom,"sudo -u ");
    strcat(lcom,usr);
    strcat(lcom," gnome-screensaver-command -l");
    strcpy(ucom,"sudo -u ");
    strcat(ucom,usr);
    strcat(ucom," gnome-screensaver-command -d");
    struct input_event ev;
    int cursor=0;
    while (1)
    {
        read(fd, &ev, sizeof(struct input_event));
        if(ev.type == 1)//only key ID event
            if(ev.value == 0)//only not repeat
        if(ev.code== 28||ev.code==14){//if code is enter or bsp, reset the counter and compare
            inp[cursor]='\0';//terminate string
            cursor=0;
            if(strcmp(inp,tag)==0){//if input string equals tag, strcmp works funny lol
                int status=getStatus();//find out what the screensaver is doing
                if(status==1){//screensaver is unlocked, so lock it
                    printf("Locking...");
                    system(lcom);}
                else if(status==0){//screensaver is locked, so unlock it!
                    printf("Unlocking...");
                    system(ucom);}
                else printf("Wat happened");//???
            }
        }
            else{//if not enter or bsp, log it      
            inp[cursor]=arr[ev.code];
            cursor++;
        }
    //fflush(stdout);this was here for debug purposes, since apparently I dont know how STDOUT works lol
    }
}

相关内容