First some interesting fact. Earlier I wrote that performed limited user 
permissions setup according to reply in the How do I let an SDL app (not 
running as root) use the console 
<https://unix.stackexchange.com/questions/58961/how-do-i-let-an-sdl-app-not-running-as-root-use-the-console>
 
StackExchange post. Today I discovered that rights change on /dev/console 
doesn’t survive reboot. I changed rights back and immediately, without 
rebooting, tried pygame example again. No visible changes, same “Unable to 
open console terminal” error for the limited user.

суббота, 8 июля 2017 г., 6:40:08 UTC+3 пользователь Martin Kühne написал:
>
> > I already changed permissions for the limited user (pi) according to 
> this instruction: How do I let an SDL app (not running as root) use the 
> console, but to no avail :( 
>
> I just wanted to suggest you make sure permissions in /dev are 
> granted, but you appear to have arrived at that conclusion yourself. 
> Of course now you have to figure out which device is being opened 
> unsuccessfully. /dev/console only applies to text i/o and not 
> framebuffer and graphics. /dev/fb0 maybe? Maybe use strace instead? 
>
> cheers! 
> mar77i 
>

I tried running under strace and got 2 log files: one of running under root 
and one for running under limited user (pi). Here is the different part:

ssh terminal, run as root

ssh terminal, run as limited user

Comment

open("/dev/tty0", O_WRONLY) = 5

ioctl(5, VIDIOC_QUERYCAP or VT_OPENQRY, 0x1e5f89c) = 0

close(5)                = 0

open("/dev/tty0", O_WRONLY) = 5

ioctl(5, VIDIOC_QUERYCAP or VT_OPENQRY, 0x776e1c) = 0

close(5)                = 0

Visible match, but I don’t know whether ioctl output data was the same, 
looking at subsequent system calls I suppose it wasn’t.

Frankly speaking, I don’t understand what does ioctl call with 2 OR’ed 
requests mean…

According to this article <http://www.linuxjournal.com/article/2783> (it’s 
1994!!! But there is no reason not to believe…), ioctl VT_OPENQRY is 
something like “kernel, give me some number of the free terminal I could 
use”

geteuid32()             = 0

geteuid32()             = 1000

Mismatch: got user ID we are running behind of

open("/dev/vc/2", O_RDWR) = -1 ENOENT (No such file or directory)

Mismatch: there was no try to open "/dev/vc/2" under limited user

open("/dev/tty2", O_RDWR) = 5

Mismatch: there was no try to open "/dev/tty2" under limited user

Looking at this and previous system calls I suppose ioctl VT_OPENQRY 
returned terminal number 2 for the case when pygame was run under root. For 
the limited-user case it’s not clear what was the result of that ioctl.

open("/dev/tty", O_RDWR) = 6

open("/dev/tty", O_RDWR) = 5

Match: opened current terminal device

ioctl(6, TIOCNOTTY)     = 0

close(6)                = 0


Root version detached itself from the current terminal. As I could find 
using Google, this is what usually daemon processes started from terminal 
do.

ioctl(5, VT_GETSTATE, 0x7ee7da28) = -1 ENOTTY (Inappropriate ioctl for 
device)

According to article mentioned above, ioctl VT_GETSTATE query is something 
like “kernel, give me list of terminals available and their use state”

ioctl(5, KDGKBMODE, 0x7eaf2078) = 0

ioctl(5, KDGKBMODE, 0x7ee7da28) = -1 ENOTTY (Inappropriate ioctl for device)

“Kernel, give me keyboard mode associated with this tty”

Limited-user version run this request on /dev/tty and root-user version run 
on /dev/tty2.

ioctl(5, KDGKBENT, 0x7eaf2078) = 0

close(5)                = 0

munmap(0x74340000, 3145728) = 0

close(3)                = 0

rt_sigaction(SIGINT, NULL, {0x127304, [], SA_RESTORER, 0x76d18180}, 8) = 0

rt_sigaction(SIGTERM, NULL, {SIG_DFL, [], 0}, 8) = 0

write(2, "Traceback (most recent call last"..., 35) = 35

Seems previous ioctl result was fatal for limited-user version.

Despite large amount of data from strace, it’s really not clear to me what 
permissions and on what files should I set to allow limited user to run 
pygame from ssh terminal...
 

Reply via email to