Tôi muốn sử dụng chương trình dựa trên SDL để hiển thị đồ họa trên bàn điều khiển, mà không phải đăng nhập từ bàn điều khiển và không chạy chương trình với quyền root. Ví dụ, tôi muốn có thể chạy nó thông qua ssh. Hệ điều hành mục tiêu là raspbian.
Dưới đây là một ví dụ ngắn trong python để minh họa vấn đề:
import os, pygame
os.environ['SDL_VIDEODRIVER'] = 'fbcon'
pygame.init()
s = pygame.display.set_mode()
print "Success"
Điều này hoạt động (chạy đến hoàn thành, không ném ngoại lệ) nếu tôi chạy nó từ bàn điều khiển và nó hoạt động thông qua ssh nếu tôi chạy nó dưới quyền root.
Tôi đã kiểm tra rằng người dùng của tôi nằm trong nhóm âm thanh và video.
Tôi đã sử dụng strace để xem có gì khác biệt giữa việc chạy nó từ bàn điều khiển (hoạt động), chạy nó dưới quyền root thông qua ssh (cũng hoạt động) và chạy nó như một người dùng thông thường qua ssh (không hoạt động).
Sự khác biệt đầu tiên là người dùng của tôi không có quyền truy cập / dev / tty0. Tôi đã tạo một nhóm mới (tty0), đưa người dùng của tôi vào nhóm đó và thêm quy tắc udev để cấp cho nhóm đó quyền truy cập vào / dev / tty0.
Đầu ra strace phân kỳ tại cuộc gọi ioctl này - sự thất bại được hiển thị ở đây; ioctl trả về 0 khi chương trình được chạy từ bàn điều khiển hoặc chạy từ ssh với quyền root:
open("/dev/tty", O_RDWR) = 4
ioctl(4, VT_GETSTATE, 0xbeaa01f8) = -1 EINVAL (Invalid argument)
(Các địa chỉ cũng khác nhau, nhưng điều đó không quan trọng.)
Cho rằng chương trình của tôi hoạt động khi nó chạy bằng root, tôi nghĩ điều này có nghĩa là tôi có vấn đề về quyền. Làm cách nào để cung cấp các quyền cần thiết cho người dùng của tôi để có thể chạy chương trình này mà không cần đăng nhập tại bảng điều khiển (và không chạy bằng root)?