HOW TO INVOKE ZZZ WITHOUT SUDO
Notice
------------------------------------------------------------
Update: <2023-09-11 Mon 21:38>
The method originally outlined in this article ("Learning to
sleep") for invoking `zzz' without `sudo' is flawed. Because
the `/sys/' folder is regenerate each boot, the group and
permission modifications not persist through a reboot
cycle. This is a lesson learned for me, and another
interesting detail about Linux uncovered.
A better way of making `zzz' easier to invoke (still with
sudo, inevitably) is by adding your user to the `wheel'
group and modifying `/etc/sudoers' to allow `wheel' group
members to execute commands without a password.
,----
| usermod -aG wheel roygbyte
| ed /etc/sudoers
| > 83
| > s/#//
| > wq
| # For those not using ed(1): remove # from line that reads
| # `#%wheel ALL=(ALL:ALL) NOPASSWD: ALL`
`----
You can test this by logging into a new shell or logging
in/out of your X session.
Adding an alias to `.bashrc' would make it possible to at
least hide the use of `sudo', if that's still desired.
,----
| alias zzz='sudo zzz'
`----
Easier still is to add a key binding to `/.config/i3/config'
to sleep the computer while while in `i3':
,----
| bindsym $mod+Shift+l exec sudo zzz
`----
Learning to sleep
------------------------------------------------------------
As mentioned above, this method doesn't work. I'm keeping it
up anyways.
`zzz' is a clever program for putting your computer to
sleep. It has a cute name, a nice man page with descriptions
of various computer sleep states, and straight forward error
reporting. It was available to me out-of-the-box on Void,
although I didn't find out about it right away.
Before I started using `zzz', I would put my computer to
sleep by writing directly to `/sys/power/state'. For
instance:
,----
| $ sudo echo -n disk > /sys/power/state
`----
Though arduous, learning this sequence of commands let me
better understand how `/sys' files represent different parts
of the computer, how writing to these files can cause
certain things to happen, and how reading from these files
can provide information about the system.
Soon enough I needed a faster way to put my computer to
sleep. I learned about `zzz' through a search or maybe the
Void documentation. (I don't remember). I started using it
right away. Immediately I got an error:
,----
| $ zzz
| zzz: sleep permission denied
| # Error explained in man page: "You lack sufficent privilege to write to /sys/power/state."
`----
I got around this by invoking `zzz' using `sudo'. But typing
my password in each time I wanted my computer to snooze
became irritating. I figured there must be a better way!
I'd been reading a bit about SysV during this
time. Something must have clicked because I realized I could
probably change the ownership permissions of the file in
such a way that my account would be able to invoke `zzz'
without `sudo'.
On a lark, I started fooling around to see how to do
this. First, I `ll''d the file in question, revealing
`root:root' ownership and `rw-r--r--' permissions. That
would explain the requirement for `sudo'. Next I looked into
`/etc/groups' to see if there were any system-y type groups
I could use in lieu of `root' for the file. I didn't find
any, so I decided I'd create one called `sys'. I'd use this
group to extend permissions for files in `/sys/*', starting
with `power/state' and including other files over time as
need be. Then it was a simple matter of invoking `chmod',
`chown', and `usermod' to put everything together. See the
next section for a step-by-step how-to.
How-to
------------------------------------------------------------
Here's how I made `zzz' available to my user without having
to invoke `sudo'.
Frist, create a new group called `sys'. (You could use any
group name, of course. `cis', `cyst', and `sis' are all
great alternatives.)
,----
| $ groupadd sys
`----
Add your user account into the group.
,----
| $ usermod -aG sys roygbyte
`----
Change the group for `/sys/power/state'.
,----
| $ chown :sys /sys/power/state
`----
Adjust the permissions of `/sys/power/state', adding write
permissions for the `sys' group.
,----
| $ chmod g+w /sys/power/state
`----
You should now have something like this:
,----
| -rw-rw-r-- 1 root sys 4096 Aug 30 08:30 /sys/power/state
`----
You can test it worked by logging into a new shell.
,----
| $ su roygbyte
| $ groups
| > roygbyte : roygbyte sys ...
| $ zzz
`----
For the new group to be available in all existing logged in
shells you must exit and log back into your session.
That's it.
Happy computer dreaming!
Adding hooks
............................................................
Hooks run as user zzz-user-hooks pxkg
Colophon
------------------------------------------------------------
I was inspired to write this post by Solene, whose gopher
hole includes lots of little computer hints and
tutorials. Indeed--no bit of computer how-do'er-y is too
small to be worth writing about!
Thanks to feranur, luca, ahesford, from libera#voidlinux for
improving this teeny article with suggestions,
grammar-checks, and alternative approaches.