Как я позволяю приложению SDL (не работающий как корень), используют консоль

Насколько я знаю команду:

     git log

Покажет все истории пересмотра. Если это верно, я предполагаю, что Вы пытаетесь сохранить содержание в файле, названном myfile, и затем Вы хотите не считать никакие из строк в файле.

Если это - то, что Вы хотите, сначала можно сохранить историю таким образом:

     git log>myFile.txt

Теперь Вы не должны находить никакие из строк с помощью туалета-l и хранить его файл под названием nOfLines.txt

Таким образом, необходимо сделать это:

    wc -l<myFile.txt>nOfLines.txt

Затем сохраните содержание этого файла в переменной, названной gitVar.

     gitVar=$(cat nOfLines.txt)

Вы видите, работает ли это правильно с помощью этой команды:

     echo "$gitVar"

Просто свяжите все это в сценарии, названном "myCommand.sh", дайте ему permssions, использующий chmod a+x, и запустите скрипт от терминала как команда.

14
21.12.2012, 01:24
3 ответа

Хотя ваш вопрос несколько неоднозначен (что подразумевается под консолью), я попытаюсь ответить для наиболее распространенных случаев: /dev/console, /dev/tty, /dev/fb0 ... адаптируйте это к устройствам, которые вам нужны. Мы предполагаем, что имя пользователя - "myuser."

Посмотрите на разрешения устройства (это ubuntu 15.04)

odroid@mbrxu3:~/projects/sc$ ls -l /dev/console
crw------- 1 root root 5, 1 Oct  23  17:49 /dev/console

odroid@mbrxu3:~/projects/sc$ ls -l /dev/tty
crw-rw-rw- 1 root tty 5, 0 Oct 24 17:50 /dev/tty

odroid@mbrxu3:~/projects/sc$ ls -l /dev/fb0 
crw-rw---- 1 root video 29, 0 Jan  1  2000 /dev/fb0

Примите меры

/dev/console

группа - "root", но групповой доступ не разрешен. Мне не нравится просто добавлять разрешения в группу root, поэтому вместо этого я создаю группу и chgrp файл и изменяю разрешения

$ sudo addgroup --system console
$ sudo chgrp console /dev/console
$ sudo chmod g+rw /dev/console
$ sudo usermod -a -G console <myuser>     <==== replace <myuser>

/dev/tty

$ sudo usermod -a -G tty <myuser>

/dev/fb0

$ sudo usermod -a -G video <myuser> 

Вы можете использовать команду usermod, чтобы добавить вашего пользователя во все вышеперечисленные группы, если это вам нужно.

2
27.01.2020, 19:52

Моя цель была такой же, как у оригинального плаката, но с одним отличием :Мне нужно было запустить приложение SDL как демон systemd. Моя машина с Linux — Raspberry Pi 3, а операционная система — Raspbian Jessie. Клавиатура или мышь не подключены к RPi. Подключаюсь к нему по SSH. Мое приложение SDL на самом деле основано на Pygame -. Я установил pygame/SDL для использования драйвера кадрового буфера «fbcon» через переменную среды SDL _VIDEODRIVER. Мой вывод systemd --version—:

systemd 215 +PAM +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ -SECCOMP -APPARMOR

Моя версия пакета pygame:(aptitude show python-pygame):

1.9.2~pre~r3348-2~bpo8+rpi1

Моя версия libSDL 1.2:(aptitude show libsdl1.2debian-на вашем компьютере имя пакета может быть другим):

1.2.15-10+rpi1

Рецепт

  1. Настройте разрешения для файлов /dev/tty и /dev/fb0, как описано в Ответ UDude. Я обнаружил, что права /dev/console меняются. не нужны в Raspbian Jessie.
  2. Добавьте эти строки в раздел [Service] вашего демона.service файл:

    User=pi #Your limited user name goes here
    StandardInput=tty
    StandardOutput=tty
    TTYPath=/dev/tty2   # I also tried /dev/tty1 and that didn't work for me
    

    Если кому интересно, вот полный файл pyscopefb.service, который я использовал:

    [Unit]
    Description=Pyscopefb test service 
    Wants=network-online.target
    After=rsyslog.service
    After=network-online.target
    
    [Service]
    Restart=no
    ExecStart=/home/pi/Soft/Test/pygame/pyscopefb
    ExecStop=/bin/kill -INT $MAINPID
    OOMScoreAdjust=-100
    TimeoutStopSec=10s
    User=pi
    WorkingDirectory=/home/pi/Soft/Test/pygame
    StandardInput=tty
    StandardOutput=tty
    TTYPath=/dev/tty2
    
    [Install]
    WantedBy=multi-user.target
    
  3. Введите эти команды в командной строке (Я предполагаю, что файл pyscopefb.service уже помещен в нужное место, где systemd может его найти):

    sudo systemctl daemon-reload
    sudo systemctl start pyscopefb
    

Это работает для меня. Обратите внимание, что я не проверял, может ли приложение pygame получать события клавиатуры и мыши или нет.

Бонус

Пришлось решить еще 2 задачи, которые тоже могут быть интересны

  1. В нижней части экрана мигал текстовый курсор с графика фреймбуфера. Чтобы решить эту проблему, я добавил в свое приложение следующий код Python, который запускается в моем приложении до инициализации Pygame/SDL:

    def _disable_text_cursor_blinking(self):
        command_to_run = ["/usr/bin/sudo", "sh", "-c", "echo 0 > /sys/class/graphics/fbcon/cursor_blink"]
        try:
            output = subprocess32.check_output(command_to_run, universal_newlines = True)
            self._log.info("_disable_text_cursor_blinking succeeded! Output was:\n{output}", output = output)
        except subprocess32.CalledProcessError:
            self._log.failure("_disable_text_cursor_blinking failed!")
            raise
    
  2. Примерно через 10 минут экран подключился к HDMI Raspberry Pi. вывод стал черным (, но не выключился ), и моя графика не display, хотя Pygame не сообщил об ошибках. Это оказалось функция энергосбережения.Чтобы отключить это, я добавил следующий Python код, который также запускается до инициализации Pygame/SDL:

    def _disable_screen_blanking(self):
        command_to_run = ["/usr/bin/setterm", "--blank", "0"]
        try:
            output = subprocess32.check_output(command_to_run, universal_newlines = True)
            self._log.info("_disable_screen_blanking succeeded! Output was:\n{output}", output = output)
        except subprocess32.CalledProcessError:
            self._log.failure("_disable_screen_blanking failed!")
            raise
    
4
27.01.2020, 19:52

Исходя из моего недавнего опыта, помимо предоставления разрешения на ваше устройство tty (, как упоминалось ранее ), вам нужно сделать 2 дополнительные вещи:

  • предоставление возможностей конфигурации cap _sys _tty _для исполняемого файла. Если вы используете программу на python, вы можете сделать это, например,setcap cap_sys_tty_config+eip /usr/bin/python3.5(замените путь для python на ваш ). Конечно, примите во внимание, что вы предоставляете эту возможность для любого скрипта Python.
  • запуск процесса в новом виртуальном терминале, например. с помощью openvt:openvt./your_script.py
-1
27.01.2020, 19:52

Теги

Похожие вопросы