所以,我有这个 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
}
}