Интерактивный скрипт с read при запуске системы (debian). Как?
Мне нужно, чтобы при запуске системы, у меня запустился скрипт
rc.local не поможет, так как в скрипте есть read, а rc.local не поддерживает терминал
bashrc не поможет, так как я хочу дёрнуть скрипт до логина
Давайте поподробнее распишу
У меня есть пользовательский образ debian, собранный с помощью live-build
В этом образе есть система виртуализации xen. В образ вшито 2 архива с гостевыми системами
В моём скрипте спрашивается для какой машины ставится образ. В зависимости от ответа распаковывается определённый архив, остальное удаляется
Это нужно сделать при первом запуске системы. Как бы в продолжении установки
Подскажите, пожалуйста как это сделать
Пока только из идей, это сделать автологин, далее в bashrc запускается мой скрипт, а в конце скрипта он удаляет автологин и свой запуск из bashrc
shurshur, Давайте поподробнее распишу
У меня есть пользовательский образ debian, собранный с помощью live-build
В этом образе есть система виртуализации xen. В образ вшито 2 архива с гостевыми системами
В моём скрипте спрашивается для какой машины ставится образ. В зависимости от ответа распаковывается определённый архив, остальное удаляется
Это нужно сделать при первом запуске системы. Как бы в продолжении установки
Подскажите, пожалуйста как это сделать
Пока только из идей, это сделать автологин, далее в bashrc запускается мой скрипт, а в конце скрипта он удаляет автологин и свой запуск из bashrc
thotem, всё равно непонятно. Чем плохо делать это ручным запуском скрипта?
Если это надо делать на десятках серверов - запускать скрипт с помощью ansible. В том числе и автоматизировать проверку того, что скрипт уже отрабатывал. Лучше даже вообще функционал скрипта переписать на ansible, потому что это может быть более эффективно.
Сделал в итоге костыль, который потом убирает мусор после себя
в rc.local прописывается скрипт, который включает автологин
после него система сама запускается, тут же срабатывает bash.rc с нужным мне скриптом, в конце которого удаляется автологин и rc.local и сам bash.rc
Передавать параметром через строку параметров загрузки ядра. Также как передается single/emergency. Только надо код инит-шелла посмотреть, чтобы убедиться, что все непонятные параметры "уехали" в multiuser.
Можно даже в грабе сделать две строки типа "Загрузка и установка машины 1", "Загрузка и установка машины 2"
Ввод пользователя должен кто то принять и передать в приложение, если X-сервер еще не запущен (хотя никто не мешает его запустить), то используй терминал, в linux сейчас используют agetty (этих *getty с десяток в репах можно подобрать).
Делать это в rc.local считается уже некошерным способом, поэтому делаешь скрипт systemd
[Unit]
Description=My Interactive Script
# Запускаемся до display manager и login prompt
Before=display-manager.service getty.target
# Блокируем запуск этих сервисов до завершения нашего
Conflicts=getty@tty1.service
After=systemd-user-sessions.service plymouth-quit-wait.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/path/to/your/script.sh
StandardInput=tty
TTYPath=/dev/tty1
TTYReset=yes
TTYVHangup=yes
# Принудительно переключаемся на tty1
ExecStartPre=/bin/chvt 1
[Install]
WantedBy=multi-user.target
Type=oneshot - служба считается запущенной только после завершения скрипта
RemainAfterExit=yes - сохраняет состояние службы после завершения
Conflicts=getty@tty1.service - предотвращает запуск getty на tty1
Before=display-manager.service getty.target - гарантирует запуск до графического интерфейса и login prompt
ExecStartPre=/bin/chvt 1 - переключает на первый TTY
но нужно проверять, конкретно это After=systemd-user-sessions.service plymouth-quit-wait.service хз
1. В read можно добавить timeout, и если никто в течение указанного времени ничего не ввел, он пойдет дальше с пустым значением, его можно проверить и поставить что-то по умолчанию.
2. В скрипт, который что-то читает, можно перенаправить готовый "файл ответов"
Да скорее всего задачу можно переформулировать так, чтобы во вводе не было необходимости. Через параметры ядра передавать например (правда init-шелл придется подпилить)