Может ли rc.local дождаться завершения сценария Bash перед загрузкой

Я использую скользящий выпуск Kali Linux и начал писать скрипт, который запускается rc.local при загрузке, который позволит пользователю обновить имя хоста компьютера.

rc.local:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/root/hostnameBoot

exit 0

hostnameBoot Script:

#!/bin/bash
# /etc/init.d/hostnameBoot

# Solution Added
exec < /dev/tty0

echo "Enter desired hostname:"
read hostname
echo "New hostname: $hostname"

#exit 0

Как вы можете видеть, в настоящее время hostnameBoot предлагает пользователю ввести новое имя хоста, а затем возвращает имя хоста пользователю.

После загрузки rc.local выполнит скрипт, но не предложит пользователю ввести новое имя хоста.

Пример загрузки при загрузке:

- misc boot info - 
Enter desired hostname:
New hostname:

Пример загрузки при загрузке показывает все сразу и не позволяет пользователю вводить новое имя хоста. Как только строки показаны, система переходит к экрану входа в систему. Желаемое поведение системы позволит пользователю ввести новое имя хоста, а затем будет представлен ранее введенный ввод.

примечание: скрипт не является конечным продуктом, это было просто подтверждение концепции использования rc.local для запуска скрипта.

1 ответ

Решение

Загрузочные скрипты, в том числе rc.localобычно не выполняются в интерактивном режиме (то есть с полностью работающим терминалом, в который пользователь может вводить данные). Их вывод перенаправляется на консоль (чтобы вы могли видеть загрузочные сообщения), но вход скорее всего /dev/null (так read возвращается сразу с нечего читать).

Вам нужно будет либо вручную перенаправить чтение, чтобы использовать фиксированный терминал все время (например, read </dev/tty0) или откройте виртуальную консоль, чтобы сделать пользовательский ввод (например, openvt -s -w /root/hostnameBoot). Смотрите этот ответ для более подробной информации.

Другие вопросы по тегам