package module
Version: v0.0.0-...-8807b4e Latest Latest

This package is not in the latest version of its module.

Go to latest
Published: Aug 17, 2020 License: MIT Imports: 10 Imported by: 0



Capture global keyboard events on Linux

Build Status GoDoc License MIT


  • Only Linux based
  • Need root privilages


go get

Getting started

Finding keyboard device

There is a helper on finding the keyboard.

 keyboard := keylogger.FindKeyboardDevice()

Which goes through each file device name to find keyword "keyboard"


and returns the file event path if found


If the function returns empty string, you will need to cat each device name and get the event number. If you know already, you can easily pass it to constructor

Getting keypress

Once the keylogger returns channel event, you can switch by event code as described in input_event.go For start, you can listen on keyboard state change


Once you get desire event, there is a helper to parse code into human readable key.



If you listen on keyboard state change, it will return double results. This is because pressing and releasing the key are 2 different state change. There is a helper function which you can call to see which type of state change happend

// returns true if key on keyboard is pressed

// returns true if key on keyboard is released

You can find a example script in example/main.go

Running tests

No magic, just run

go test -v

Creating key sniffer (needs update)


This library is under the MIT License


I don't drink beer, so energy drink will do :)

BTC: 19AtHE6dgKX3R9vJSCSKRyF1saexLcBRep



Package keylogger is a go library for linux to capture keyboard events. About:

* No C deps

* Events ported from uapi/linux/input.h

* Needs root privilages

* Transfer keyboard code into human readable key

* Capture state changes

See README at for more info.



This section is empty.


This section is empty.


func FindAllKeyboardDevices

func FindAllKeyboardDevices() []string

Like FindKeyboardDevice, but finds all devices which contain keyword 'keyboard' Returns an array of file paths which contain keyboard events

func FindKeyboardDevice

func FindKeyboardDevice() string

FindKeyboardDevice by going through each device registered on OS Mostly it will contain keyword - keyboard Returns the file path which contains events


type EventType

type EventType uint16

EventType are groupings of codes under a logical input construct. Each type has a set of applicable codes to be used in generating events. See the Ev section for details on valid codes for each type

const (
	// EvSyn is used as markers to separate events. Events may be separated in time or in space, such as with the multitouch protocol.
	EvSyn EventType = 0x00
	// EvKey is used to describe state changes of keyboards, buttons, or other key-like devices.
	EvKey EventType = 0x01
	// EvRel is used to describe relative axis value changes, e.g. moving the mouse 5 units to the left.
	EvRel EventType = 0x02
	// EvAbs is used to describe absolute axis value changes, e.g. describing the coordinates of a touch on a touchscreen.
	EvAbs EventType = 0x03
	// EvMsc is used to describe miscellaneous input data that do not fit into other types.
	EvMsc EventType = 0x04
	// EvSw is used to describe binary state input switches.
	EvSw EventType = 0x05
	// EvLed is used to turn LEDs on devices on and off.
	EvLed EventType = 0x11
	// EvSnd is used to output sound to devices.
	EvSnd EventType = 0x12
	// EvRep is used for autorepeating devices.
	EvRep EventType = 0x14
	// EvFf is used to send force feedback commands to an input device.
	EvFf EventType = 0x15
	// EvPwr is a special type for power button and switch input.
	EvPwr EventType = 0x16
	// EvFfStatus is used to receive force feedback device status.
	EvFfStatus EventType = 0x17

type InputEvent

type InputEvent struct {
	Time  syscall.Timeval
	Type  EventType
	Code  uint16
	Value int32

InputEvent is the keyboard event structure itself

func (*InputEvent) KeyPress

func (i *InputEvent) KeyPress() bool

KeyPress is the value when we press the key on keyboard

func (*InputEvent) KeyRelease

func (i *InputEvent) KeyRelease() bool

KeyRelease is the value when we release the key on keyboard

func (*InputEvent) KeyString

func (i *InputEvent) KeyString() string

KeyString returns representation of pressed key as string eg enter, space, a, b, c...

type KeyLogger

type KeyLogger struct {
	// contains filtered or unexported fields

KeyLogger wrapper around file descriptior

func New

func New(devPath string) (*KeyLogger, error)

New creates a new keylogger for a device path

func (*KeyLogger) Close

func (k *KeyLogger) Close() error

Close file descriptor

func (*KeyLogger) IsRoot

func (k *KeyLogger) IsRoot() bool

IsRoot checks if the process is run with root permission

func (*KeyLogger) Read

func (k *KeyLogger) Read() chan InputEvent

Read from file descriptor Blocking call, returns channel Make sure to close channel when finish


Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
t or T : Toggle theme light dark auto
y or Y : Canonical URL