Может ли 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
). Смотрите этот ответ для более подробной информации.