Рейтинг:1

Lubuntu 20.04 Запустить скрипт при входе в систему, который выполняется в окне терминала

флаг mx

Моя цель: Выполните сценарий оболочки после входа в систему, который запускается с привилегиями root и принимает соответствующий пользовательский ввод из окна терминала, чтобы определить свой следующий курс действий.

Сценарий: Сценарий, который я запускаю, сообщает пользователю, что второй сценарий будет автоматически запущен через 60 секунд, если пользователь не введет s или S. Обратный отсчет показывает оставшееся время. Если пользователь ввел правильную команду выхода, сценарий завершается, и система продолжает работать в обычном режиме. Если в течение 60 секунд не будет введено ничего действительного, запускается второй сценарий. Второй сценарий также должен выполняться от имени пользователя root (поэтому первый сценарий должен запускаться от имени пользователя root), поскольку он имеет сторожевой таймер, который выполняет жесткую перезагрузку системы в случае аппаратного сбоя.

Баш-скрипт:

#!/бин/баш

#Подскажите пользователю информацию.

echo "Майнер начнется через 60 секунд."
echo "Нажмите s + enter, чтобы остановить процесс и возобновить нормальную работу."

#Объявить переменные.

ввод = "а"
пусть секунды = 60

# Ждите ввода пользователя и обратного отсчета.

в то время как [$seconds -gt 0]; делать
    printf "\r........."$секунд
    читать -s -t 1 ввод
    пусть "секунды-=1"
    если [ "$ input" = "s" ] || [ "$ input" = "S" ]; тогда
        сломать
    фи
сделано

эхо

#Начать выбор пользователя

если [ "$ input" = "s" ] || [ "$ input" = "S" ]; тогда
    echo "Возобновление нормальной работы."
    спать 2
еще
    echo "Запуск майнера."
    спать 2
    ./TeamRedMiner_Config.sh
фи

Цель: Этот сценарий предназначен для перезапуска программы майнинга после того, как сторожевой таймер перезапустит систему в случае сбоя графического процессора. Подсказка пользователя дает мне время остановить выполнение майнера после входа в систему, если я хочу использовать систему в обычном режиме. Обычно я нахожусь вдали от системы, так что это очень важно для продолжения майнинга. Отказ графического процессора довольно распространен после 2 с лишним дней работы (несмотря на снижение частоты, пониженное напряжение и т. Д.) Для одной из моих карт, поскольку к этому моменту она становится очень старой (более 6 лет).

Я провел большое количество исследований и еще не нашел решения, которое сработало для меня. Большинство сосредотачивается на выполнении сценария, который не требует внешнего ввода или окна терминала. Если это так, то это всего лишь несколько команд. Мне нужно что-то, что запускает окно терминала, чтобы я мог видеть подсказки и обратный отсчет. Кроме того, мне нужно, чтобы окно терминала отображало статус майнера после его запуска.

Что я пробовал:
Исходные условия: файл .sh, исполняемый и принадлежит пользователю root.

  1. Используйте systemd для выполнения скрипта как файла .service (ничего не произошло)
  2. Используйте crontab для выполнения скрипта при загрузке (ничего не произошло)
  3. Размещение скрипта в профиль.d (Lubuntu потребовалось больше времени для входа в систему, хотя ничего не произошло)
  4. Редактирование $HOME/.bashrc и $HOME/.профиль файлы, добавив ./AutoStartMiner.sh в начало файлов (привело к зависанию системы)

Надеюсь, это показывает, что я приложил немало усилий, и мы сможем найти решение этой проблемы. Спасибо!

sudodus avatar
флаг jp
1. `sudo crontab -e` — это способ ввести задание cron для root. Но я не знаю, как заставить это взаимодействовать с пользователем; Вам нужен полный путь ко всем программам (или укажите переменную PATH в rontab; 2. Вместо этого вы можете использовать **autostart**.[Этот пример] (https://askubuntu.com/questions/1251814/xrandr-command-in-startup-script-has-no-effect-but-script-does-run-and-command/1251882#1251882) может помочь вам создать свою работу автозапуска. Я думаю, вы должны дать пользователю время на ввод пароля [user], чтобы заставить задачу sudo работать, потому что скрипт, вероятно, будет (и должен) запрашивать пароль.
XXX_BlueFire_XXX avatar
флаг mx
На самом деле я хочу обойти ввод пароля в этом случае, потому что я не могу находиться перед самой системой, когда скрипт выполняется. По сути, это перезапуск майнера после того, как система обнаружила критическую ошибку. В случае, когда я нахожусь перед системой и не собираюсь запускать майнер, я хочу, чтобы появилось окно терминала и отобразилась опция остановки автозапуска скрипта. Я думал об использовании автозапуска LXQT; однако у меня сложилось впечатление, что он не запускается как скрипт от имени пользователя root, что очень важно в этой ситуации.
sudodus avatar
флаг jp
Если никто не сможет воспользоваться дырой в безопасности, вы можете 1. использовать `sudo -S` и даже ввести пароль открытым текстом в сценарии оболочки. Но это плохая идея; 2. Лучше использовать `visudo` и разрешить выполнение только одной конкретной программы или сценария с помощью sudo без пароля. См. [эту ссылку] (https://www.computerhope.com/unix/visudo.htm). Вы можете найти гораздо больше руководств, если будете искать в Интернете «visudo» или какую-либо другую подходящую строку поиска.
XXX_BlueFire_XXX avatar
флаг mx
Безопасность на этой машине не имеет большого значения; однако лично я предпочитаю сохранять максимальную безопасность при достижении цели. Я рассмотрю visudo как способ запустить сценарий оболочки от имени пользователя root без пароля. Это хороший шаг; тем не менее, я все еще не понимаю, как именно заставить систему запускать скрипт после достижения рабочего стола с графическим интерфейсом.
sudodus avatar
флаг jp
См. также [эту ссылку AskUbuntu] (https://askubuntu.com/questions/246455/how-to-give-nopasswd-access-to-multiple-commands-via-sudoers), которая может быть более актуальной для вашего случая.
sudodus avatar
флаг jp
Смотрите ссылку в моем первом комментарии. У меня так работает автозапуск в Lubuntu 20.04.x.
XXX_BlueFire_XXX avatar
флаг mx
Будет сделано, я дам вам знать, как продвигается использование метода автозапуска. Возможно, это изменилось в более поздних версиях Lubuntu.
sudodus avatar
флаг jp
Комментарий к «Второй скрипт также должен выполняться от имени пользователя root (поэтому первый сценарий должен запускаться от имени пользователя root), поскольку он имеет сторожевой таймер, который выполняет жесткую перезагрузку системы в случае аппаратного сбоя.»: I предлагаю вам не запускать все сценарии от имени пользователя root, а **только сторожевой таймер** (специально вызываемый с помощью `sudo` во втором сценарии. Это означает, что вы должны разрешить выполнение с помощью `NOPASSWD` сторожевого таймера (устанавливается через ` зрение`).
Рейтинг:1
флаг jp

Система автозапуска, в которой часть выполняется с повышенными разрешениями

Следующий метод должен работать для вас, чтобы получить щит запускаться автоматически при запуске компьютера. Измените файлы шаблонов из этого ответа, чтобы они соответствовали вашему идентификатору пользователя и имени файла программы сторожевого таймера.

Примечание. Я предлагаю вам не запускать целые сценарии как корень, а только сторожевой таймер (специально вызываемый с помощью sudo во втором сценарии. Это означает, что вы должны разрешить выполнение с помощью NOPASSWD сторожевого таймера (устанавливается через зрение).

~/.config/autostart/shield.desktop

[Вход на рабочий стол]
Имя=щит у тестера
Комментарий=Щит только для тестирования
Exec=/home/тестер/бен/щит
Терминал=ложь
Тип = Приложение
Уведомление о запуске=истина
X-GNOME-Autostart-enabled=true

Видеть эта ссылка, в котором описывается, как сделать так, чтобы программа запускалась автоматически, когда компьютер достигает рабочего стола при загрузке с Lubuntu 20.04.x ​​LTS.

./bin/щит

#!/бин/баш 

xterm -display:0 -fullscreen -fa default -fs 16 -e bash -c \
'
tme=10 # льготный период в секундах перед началом майнинга

echo "Стоп? (п/к)"

пока [ "$tme" -gt "0" ]
делать
 эхо -n "$tme"
 tme=$((tme-1))
 читать -t1 -n1 ответ
 если [ "$ans" == s ] || [ "$ans" == S ] \
 || [ "$ans" == q ] || [ "$ans" == Q ];тогда
  эхо "- компьютер твой"
  спать 2
  выход
 фи
сделано

echo "- автодействие, запуск майнинга"
echo "$ sudo -H parted -ls # демонстрация программы, требующей sudo"
sudo -H разделенный -ls
пока правда
делать
 эхо -н "."
 читать -t1 -n1 -s an2
 если [ "$an2" != "" ];тогда
  echo "- майнинг остановлен, компьютер ваш"
  спать 3
 выход
 фи
сделано'
  • судо должен вызывать ваш сторожевой таймер вместо расстались
  • Вы также можете изменить льготный период время от 10 до 60 (секунд).

/etc/sudoers

#
# Этот файл ДОЛЖЕН быть отредактирован командой 'visudo' от имени пользователя root.
#
# Рассмотрите возможность добавления локального контента в /etc/sudoers.d/ вместо
# напрямую изменяя этот файл.
#
# См. справочную страницу для получения подробной информации о том, как написать файл sudoers.
#
По умолчанию env_reset
По умолчанию mail_badpass
По умолчанию secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# Спецификация псевдонима хоста

# Спецификация псевдонима пользователя

# Спецификация псевдонима команды

# Спецификация привилегий пользователя
корень ВСЕ=(ВСЕ:ВСЕ) ВСЕ

# Члены группы администраторов могут получить привилегии root
%admin ВСЕ=(ВСЕ) ВСЕ

# Разрешить членам группы sudo выполнять любую команду
%sudo ВСЕ=(ВСЕ:ВСЕ) ВСЕ

# См. sudoers(5) для получения дополнительной информации о директивах "#include":

#includedir /etc/sudoers.d

%tester ALL=NOPASSWD: /usr/sbin/parted

Последняя строка (и пустая строка) добавляются в файл по умолчанию. Измените его, указав свой идентификатор пользователя и имя вашей сторожевой программы.

Следующие ссылки объясняют, как редактировать sudoersфайл с зрение:

Разрешения и право собственности

-rwxrwxr-x тестер/тестер 649 26.07.2021 15:14 ./bin/shield
-rwxrwxr-x тестер/тестер 181 26.07.2021 14:47 ./.config/autostart/shield.desktop
-r--r----- root/root 795 26.07.2021 14:19 и т. д./sudoers

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

щит полноэкранный и выглядит так

Когда вы прерываете его в течение льготного периода перед майнингом:

введите описание изображения здесь

Когда вы позволите ему начать добычу, здесь смоделировано с помощью расстались и точки(.....), и, наконец, остановите майнинг, чтобы использовать компьютер для других целей:

введите описание изображения здесь

Вы можете изменить размер текста в xterm окно из -фс 16.

XXX_BlueFire_XXX avatar
флаг mx
Привет, sudodus, спасибо, что нашли время, чтобы так подробно ответить на вопрос. В свободное время мне удалось найти другое решение, которое я опубликую ниже, когда у меня будет время. Кроме того, я очень хочу попробовать ваше решение на другом компьютере, чтобы научиться. Спасибо!
sudodus avatar
флаг jp
Добро пожаловать, и я с нетерпением жду вашего решения :-)
Рейтинг:1
флаг mx

Хорошо, прошло некоторое время, хотя у меня наконец-то появилось время, чтобы сесть и написать свое решение. Это был мой первый раз, когда я писал сценарий bash, так что это было захватывающе.

В итоге я использовал комбинацию из 3 сценариев, 2 из которых получили права root в файле sudoers. Возможно, есть лучший способ сделать это; однако я просто указал полный путь к скрипту.

Судо Визудо

Затем под вкладкой #includedir /etc/sudoers.d

userName ВСЕ = NOPASSWD ПУТЬ/AutoStartMiner.sh, ПУТЬ/TeamRedMiner_Config.sh, Путь/teamredminer

Это подготовит почву для того, чтобы 3 скрипта работали один за другим без проблем.

Чтобы запустить AutoStartMiner.sh в окне терминала, я использовал эмулятор gnome-terminal. Для тех, кто реализует что-то подобное, вам необходимо установить эмулятор через:

sudo apt установить gnome-терминал

Затем я воспользовался центром конфигурации LXQT и перешел к настройкам сеанса. В настройках сеанса я установил сценарий StartTerminalASM.sh для выполнения после загрузки системного трея. Это было достигнуто нажатием кнопки «Добавить», присвоением функции автозапуска имени, вставкой полного пути к сценарию, включая сам сценарий, а затем нажатием на поле с надписью «Загрузить после системного трея». Важно отметить, что этот первый скрипт не нужно запускать с повышенными привилегиями, поэтому этот метод работает. Функция автозапуска LXQT не запускает сценарии, требующие повышенных привилегий, автоматически.

Вот содержимое первого скрипта: StartTerminalASM.sh

#!/бин/баш
gnome-terminal --command="bash -c 'sudo /home/userName/Scripts/AutoStartMiner.sh; $SHELL'"

Этот скрипт просто запускает AutoStartMiner.sh в терминале gnome. Поскольку мы ранее добавили этот скрипт в файл sudoers, команда sudo выполняется без запроса пароля.

Вот второй скрипт: AutoStartMiner.sh

#!/бин/баш
# Подскажите пользователю информацию.
echo "Майнер начнется через 60 секунд."
echo "Нажмите s + enter, чтобы остановить процесс и возобновить нормальную работу."
# Переменные Делара.
ввод = "а"
пусть секунды = 60
# Ждите ввода пользователя и обратного отсчета.
в то время как [$seconds -gt 0]; делать
  printf "\r........."$секунд
    читать -s -t 1 ввод
    пусть "секунды-=1"
    если [ "$ input" = "s" ] || [ "$ input" = "S" ]; тогда
        сломать
    фи
сделано
эхо
#Начать выбор пользователя
если [ "$ input" = "s" ] || [ "$ input" = "S" ]; тогда
    echo "Возобновление нормальной работы."
    спать 2
еще
    echo "Запуск майнера."
    спать 2
    sudo /home/userName/Documents/Crypto/Miners/TeamRedMiner/teamredminer-v0.8.4-linux/TeamRedMiner_Config.sh
фи

Так что это по существу делает то, что я описал в исходном вопросе. Единственная проблема заключается в том, что когда время падает ниже 10 секунд, по какой-то причине на месте 1 появляется 0, а на месте 10 начинается отсчет чисел (например, 10, 90, 80, 70, ... и т. д.). ). Наверное, я что-то не совсем понимаю в printf заявление, которое я сделал. Аналогично выше, судо Команда здесь не запрашивает пароль из-за строки, созданной в sudoers.

Наконец, он выполняет третий скрипт: TeamRedMiner_Config.sh.

Этот скрипт просто устанавливает параметры для запуска майнера. Он также запускает майнер с судо, поэтому мы добавляем третью команду в sudoers, чтобы убедиться, что для запуска самого майнера не требуется приглашение.

Таким образом, если пользователь не предложит системе остановить запуск майнера, майнер будет выполняться без каких-либо входных данных. Это чрезвычайно полезно, так как избавляет меня от массы головной боли, если произойдет сбой ядра. Я просто нажимаю кнопку питания и бум, через минуту майнер запускается. Если бы я действительно хотел автоматизировать это, я мог бы сделать небольшой сервопривод, чтобы нажимать кнопку или настроить пробуждение по локальной сети.

Это все, как говорится, это на последнюю проблему. После обновления до ядра Linux 5.11.0-27-generic мой беспроводной адаптер отказывается подключаться к моей сети, хотя, по крайней мере, он распознается системой.

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

tripleee avatar
флаг nz
Запуск скрипта в окне терминала кажется плохим дизайном. Если вы хотите, чтобы что-то выполнялось одновременно, запустите его как фоновое задание с выводом в файл журнала и подключитесь к этому файлу журнала из любого места, где вы вошли в систему, чтобы увидеть, что оно делает.
XXX_BlueFire_XXX avatar
флаг mx
Окно терминала должно было позволить пользователю вводить данные. В настоящее время это единственный известный мне способ разрешить пользователю взаимодействовать со сценарием. Хотя, если есть другой способ, я определенно открыт для обучения.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.