Как избежать ошибки stty: ‘standard input’: неподходящий ioctl для устройства?

Вопрос или проблема

Я хочу передать два ввода (пароли) команде 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. Взаимодействие с программами, ожидающими интерактивного ввода, требует использования других методов.

Подходы к решению

  1. Использование программы 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
  2. Использование 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.

  3. Использование утилиты 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 может быть более простым решением для пользователей, ищущих менее сложные подходы.

Оцените материал
Добавить комментарий

Капча загружается...