web-dev-qa-db-ja.com

UbuntuRFIDスクリーンセーバーのロック解除

だから、私はこのel-cheapoRFIDスキャナーといくつかのRFIDタグを持っています。

私は自分自身に思いました、あなたは何がきちんとしているのか知っていますか?これでロック画面を有効または無効にします。

それでパッケージが到着し、私はそれを引き裂いて引っ掛けました。

このデバイスは、USBキーボード(ドライバーが押していたものを説明する)をエミュレートし、基本的にカードIDを入力してEnterキーを押します。

/ dev/stdin(キーロガー)から一定のストリームを開いて、必要なカードがいつパンチインされるかを監視できると思いました。それが、このばかげた単純なスクリプトの作成につながった理由です。

#!/ bin/bash 
 
 cat/dev/stdin |行
を読みながら
を実行するif ["$ line" == "0000996716"] 
次に、echo "Correct!" 
 fi 
完了

うまくいった!

次に、THENステートメントをgnome-screensaverunlockコマンドgnome-screensaver-command -dに変更しました。

そして、手動で画面をロックしました(Ctrl-Alt-L)カードをスワイプしました。スキャナーがパスワードフィールドにカード番号を入力してEnterキーを押すと、ロック画面に「パスワードが正しくありません」と表示されます。

そこで、パスワードで画面のロックを解除したところ、ターミナル画面に何も表示されていないことに気づきました。

そこで、/dev/stdinへの直接パイプを開いて、画面をロックしました。私のパスワードでロックを解除しました...もう何もありません。

なぜこれが私が期待することをしていないのですか? /dev/stdinには、ロック画面で入力されている情報が含まれていませんか?そうでない場合はどうしますか?

3
user2183032

さてあなたたちは吸う:Pそれはちょっと具体的でニッチでしたが、私はあなたに対してそれを保持しません;)

誰でも、完全なダウンのために。

元の投稿のように「無人」と表現されているこのすっきりとした小さなユニットを購入しました。これは、USBキーボードのように機能することを意味します(そして/ dev/input/event *にそのように登録されます)。これにより、ロック画面がアクティブなときにデバイスを操作できなかったため、ほとんど役に立たなくなりました。リーダーによって「入力」されていたため、デバイスからキーストロークを読み取る必要がありました。Cat-ing/dev/input/event3(私の読者)は私にゴミをくれました。

次に、ここでこのコードに遭遇しました: http://itech-planet.net/content/reading-device-input-directly-fromto-devinputeventx-ubuntu-c なし?私が見ることができる著者ですが、このアプリケーションのレッグワークのクレジットのほとんどは彼/彼女に行きます。ありがとう!このコードを単純化すると、秘密のフレーズが「secret」である状態で、自分のキーボードから生の入力を読み取ることができ、キーストロークを変数にキャプチャし、「enter」が押されたときに文字列を格納された値と照合するようになりました。コード用。

このコードは本質的に、別の「キーボード」を指し、「入力したもの」をスキャンして一致するフレーズにする栄光のキーロガーです。 FBIがテロリストを探している13歳の少女からの何百万ものAOLIMをふるいにかけるのと同じように!

一致するフレーズにヒットすると、ifステートメントがトリガーされ、対応する残りのコードが実行されます。何か問題があれば、私にメール/ pm/im /大声で叫んでください。

あなたがそのいずれかを読むのとは異なり、あなたはただコードが欲しいだけです!さて、ここにあります!

使用法:

Sudo ./ [ファイル] -u [ユーザー名] -d [デバイスの場所] -t [タグID]

したがって、私はタイラーであり、デバイスは/ 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
    }
}
1
user2183032