Вопрос или проблема
Я хочу передать два ввода (пароли) команде grub2-setpassword.
echo -e "linuxpassword\nlinuxpassword" | grub2-setpassword
Однако я получаю эту ошибку на CentOS 7:
stty: 'standard input': inappropriate ioctl for device
Как избежать этой ошибки?
Вы пытаетесь противоречить природе инструмента паролей grub, поэтому вам придется пройти через множество препятствий, чтобы это сделать: напрямую управлять терминалом с помощью expect, perl или python (и т.д.) или найти новый инструмент.
Скрипт для grub2-mkpasswd my passwd на github может помочь.
Ответ или решение
Чтобы избежать ошибки stty: 'standard input': inappropriate ioctl for device
, возникающей при передаче паролей в команду grub2-setpassword
, необходимо понимать, что данная команда ожидает ввода пароля без использования стандартных средств потокового ввода, таких как echo
. В этом ответе мы рассмотрим несколько подходов к решению данной проблемы.
Проблема и её суть
Ошибка, которую вы видите, возникает из-за того, что grub2-setpassword
ожидает интерактивного ввода, что невозможно при перенаправлении через echo
. Взаимодействие с программами, ожидающими интерактивного ввода, требует использования других методов.
Подходы к решению
-
Использование программы
expect
expect
позволяет автоматизировать взаимодействие с программами, требующими пользовательского ввода. Можно создать простой скрипт наexpect
, который будет вводить пароли вgrub2-setpassword
:#!/usr/bin/expect -f spawn grub2-setpassword expect "Password:" send "linuxpassword\r" expect "Password (again):" send "linuxpassword\r" expect eof
Сохраните этот скрипт в файл, например
set_grub_password.exp
, и убедитесь, что у вас установленexpect
. Чтоб запустить скрипт, используйте:chmod +x set_grub_password.exp ./set_grub_password.exp
-
Использование Python
Если у вас есть Python, вы можете использовать его для выполнения подобной задачи. Вот пример кода с использованием модуля
pexpect
:import pexpect child = pexpect.spawn('grub2-setpassword') child.expect('Password:') child.sendline('linuxpassword') child.expect('Password (again):') child.sendline('linuxpassword') child.expect(pexpect.EOF)
Убедитесь, что модуль
pexpect
установлен:pip install pexpect
Затем запустите ваш сценарий Python.
-
Использование утилиты grub2-mkpasswd-pbkdf2
Если вы хотите избежать использования
expect
или Python, вы можете воспользоваться утилитойgrub2-mkpasswd-pbkdf2
, которую упомянули в описании. Она позволяет создавать пароли в формате, который может быть принятgrub2
. Сначала создайте хэш пароля с помощью:grub2-mkpasswd-pbkdf2
После этого, следуйте инструкциям, чтобы вставить сгенерированный хэш в файл конфигурации GRUB.
Заключение
Выбор метода зависит от ваших предпочтений и доступных инструментов. Каждый из представленных способов поможет вам избежать ошибки stty: 'standard input': inappropriate ioctl for device
и успешно установить пароль для GRUB. Использование скриптов expect
или Python предлагает гибкость и автоматизацию, тогда как использование утилиты grub2-mkpasswd-pbkdf2
может быть более простым решением для пользователей, ищущих менее сложные подходы.