Я кодировал приложение с помощью libpcap и ncurses. Очевидно, это приложение, как предполагается, работает в терминале.
Поэтому я создал сценарий, который запускает мое приложение в терминале гнома с фиксированным размером:
#!/bin/sh
gnome-terminal --geometry=75x36+0+0 --command="myapplication"'
Я хочу выполнить это на запуске (после того, как рабочий стол тока вошел в систему, пользователь обнаружился). Важно выполнить это как корень. Иначе libpcap не сможет осуществить сниффинг для пакетов. Я знаю обо всех включенных рисках.
Я создал следующее .service
файл:
[Unit]
Description=My Application
[Service]
User=root
Type=simple
ExecStart=/usr/local/bin/myshellfile
[Install]
WantedBy=multi-user.target
И я вставил его /etc/systemd/system/myservice.service
и предварительная установка это с
sudo systemctl preset myservice.service
Тем не менее, это не работает. Что я делаю неправильно здесь? Под управлением Ubuntu 16.04 в обновленном состоянии.
Существует немного возможных методов для запуска приложения GUI (как gmome-терминал) при системном запуске, и возможно самое соответствующее должно использовать Приложения Запуска (см. также). Таким образом приложение будет запущено когда пользовательский вход в систему. (В любом методе мы должны экспортировать некоторый рабочий стол envvars, чтобы смочь сделать это.)
Чтобы смочь протестировать мой ответ, я создал исполняемый файл, названный myapp
, расположенный в /usr/local/bin
. Это добавляет просто текущую дату и время в файле в /root
каталог, таким образом, мы должны будем базироваться (sudo) полномочия запустить скрипт:
#!/bin/bash
date >> /root/date.txt
Мы можем дать разрешения определенному пользователю выполнять команду без пароля через sudo
. Неважно, ли пользователь принадлежит sudoers группе или нет. Мы можем использовать sudo visudo
отредактировать безопасно /etc/sudoers
и добавьте одну или несколько строк как их:
user1 ALL=(ALL) NOPASSWD: /usr/local/bin/myapp
user2 ALL=(ALL) NOPASSWD: /usr/local/bin/myapp
Лучшая идея состоит в том, чтобы создать отдельный файл, например /etc/sudoers.d/myapp
, куда поместить эти правила. С этой целью мы будем использовать команду: sudo visudo -f /etc/sudoers.d/myapp
.
Теперь user1
и user2
должен смочь работать sudo myapp
без пароля.
Примечание: Всегда используйте команду
visudo
отредактироватьsudoers
файл для проверки Вы не блокируете себя из системы – на всякий случай Вы случайно пишете что-то неправильное вsudoers
файл.visudo
сохранит Ваш измененный файл к временному местоположению и только перезапишет реальноеsudoers
файл, если измененный файл может быть проанализирован без ошибок... источник.
Следующий шаг должен изменить сценарий запуска. Давайте назовем его myapp_startup
и поместите его в тот же каталог /usr/local/bin
. Содержание сценария должно быть:
#!/bin/sh
gnome-terminal --geometry=75x36+0+0 -x bash -c "sudo myapp; exec bash"
Теперь мы можем создать запись в Приложениях Запуска как это:
sleep 3 && gnome-terminal ...
для запуска нового окна терминала после, весь рабочий стол инициализируется.$PATH
переменная (echo $PATH
) мы должны использовать полный путь, например: /usr/local/bin/myapp_startup
.Дальнейшее чтение:
Вместо терминала гнома, вероятно, можно использовать tmux
(или некоторый другой менеджер сеансов), как это описано в этом ответе.
Дополнительно можно запустить сценарий запуска через Крон (или некоторая другая ограниченная среда) сценарием cron-gui-launcher.bash
из этого проекта: https://github.com/pa4080/cron-gui-launcher. Этот сценарий будет ожидать пользователь для входа в систему и затем экспортирует все Переменные DE и т.д... Но в текущем случае конечный результат совпадет с нами использующий Приложение Запуска.