Giorgos Keramidas wrote a script that relies in dbus and UPower - which most desktop distros have up and running.
I would recommend using this instead of scripts that write to /sys/class/... as they need to be run as root - either through sudo or a by having SUID set - and that is bad security practice.
Basic usage is as simple as
kbdbacklight up kbdbacklight down kbdbacklight [ 0 | 1 | 2 | 3 ]
Add this to the i3 config
# increase/decrease keyboard brightness bindsym XF86KbdBrightnessUp exec kbdbacklight up bindsym XF86KbdBrightnessDown exec kbdbacklight down
The script itself is very simple
#!/bin/sh # By Giorgos Keramidas # backlight_get # Print current keyboard brightness from UPower to stdout. backlight_get() { dbus-send --type=method_call --print-reply=literal --system \ --dest='org.freedesktop.UPower' \ '/org/freedesktop/UPower/KbdBacklight' \ 'org.freedesktop.UPower.KbdBacklight.GetBrightness' \ | awk '{print $2}' } # backlight_get_max # Print the maximum keyboard brightness from UPower to stdout. backlight_get_max() { dbus-send --type=method_call --print-reply=literal --system \ --dest='org.freedesktop.UPower' \ '/org/freedesktop/UPower/KbdBacklight' \ 'org.freedesktop.UPower.KbdBacklight.GetMaxBrightness' \ | awk '{print $2}' } # backlight_set NUMBER # Set the current backlight brighness to NUMBER, through UPower backlight_set() { value="$1" if test -z "${value}" ; then echo "Invalid backlight value ${value}" fi dbus-send --type=method_call --print-reply=literal --system \ --dest='org.freedesktop.UPower' \ '/org/freedesktop/UPower/KbdBacklight' \ 'org.freedesktop.UPower.KbdBacklight.SetBrightness' \ "int32:${value}}" } # backlight_change [ UP | DOWN | NUMBER ] # Change the current backlight value upwards or downwards, or # set it to a specific numeric value. backlight_change() { change="$1" if test -z "${change}" ; then echo "Invalid backlight change ${change}." \ "Should be 'up' or 'down'." >&2 return 1 fi case ${change} in [1234567890]|[[1234567890][[1234567890]) current=$( backlight_get ) max=$( backlight_get_max ) value=$( expr ${change} + 0 ) if test ${value} -lt 0 || test ${value} -gt ${max} ; then echo "Invalid backlight value ${value}." \ "Should be a number between 0 .. ${max}" >&2 return 1 else backlight_set "${value}" notify-send -t 800 "Keyboard brightness set to ${value}" fi ;; [uU][pP]) current=$( backlight_get ) max=$( backlight_get_max ) if test "${current}" -lt "${max}" ; then value=$(( ${current} + 1 )) backlight_set "${value}" notify-send -t 800 "Keyboard brightness set to ${value}" fi ;; [dD][oO][wW][nN]) current=$( backlight_get ) if test "${current}" -gt 0 ; then value=$(( ${current} - 1 )) backlight_set "${value}" notify-send -t 800 "Keyboard brightness set to ${value}" fi ;; *) echo "Invalid backlight change ${change}." >&2 echo "Should be 'up' or 'down' or a number between" \ "1 .. $( backlight_get_max )" >&2 return 1 ;; esac } if test $# -eq 0 ; then current_brightness=$( backlight_get ) notify-send -t 800 "Keyboard brightness is ${current_brightness}" else # Handle multiple backlight changes, e.g.: # backlight.sh up up down down up for change in "$@" ; do backlight_change "${change}" done fi
Just save somewhere in your PATH and enjoy. I went with the name kbdbacklight and used it in the examples and i3 config above, please be mindful to update those if you name it differently.
Please note that Giorgio's script also makes use of notify-send, so make sure you have the right package installed (libnotify-bin on Debian and Ubuntu) or comment/remove those lines from the script.