Вопрос или проблема
Мой ноутбук подключен к интернету только по Wi-Fi, но иногда отключается. Когда это происходит, я не могу ssh
на него зайти и должен физически войти в систему, чтобы переподключить Wi-Fi с помощью nmcli
(я не настраивал графику).
К сожалению, некоторые клавиши на клавиатуре не отвечают, а они необходимы для входа пользователя и пароля от Wi-Fi.
Поэтому я настроил учетную запись пользователя, имя которой состоит только из работающих клавиш, и “оболочка” для входа – это скрипт для переподключения Wi-Fi:
#!/usr/bin/bash
if /usr/bin/nmcli device wifi connect 'SSID' password 'PASSWORD'; then
echo "Подключено как $(ip -json -4 address show wlp2s0 | jq -r '.[0].addr_info[0].local')"
else
echo 'Не удалось подключиться к Wi-Fi'
fi
read -sN 1 -p 'Нажмите любую клавишу для выхода...'
wirec:x:970:969::/:/opt/wirec/wirec
Это определенно не лучший вариант, но он работает, пока я жду, когда приедет новая клавиатура. Я также выяснил, что NetworkManager
имеет функцию авто-подключения, что является именно тем, что мне нужно. Тем не менее, это заставило меня задуматься:
В общем случае, когда программа ожидает чувствительного интерактивного ввода, и при отсутствии сетевого подключения, и если нет клавиатуры, возможно ли получить ввод в программу? Или записать это, когда есть связь, чтобы запустить, когда её нет, – это всё, что возможно?
В общем случае, когда программа ожидает чувствительного интерактивного ввода, и при отсутствии сетевого подключения, и если нет клавиатуры, возможно ли получить ввод в программу?
Что ж, всё сводится к тому, какие устройства ввода программа готова принимать.
Обратите внимание, что программы командной строки, такие как nmcli
, используют TTY-устройство для ввода, а не конкретно клавиатуру. Поэтому любое устройство, которое может быть представлено как TTY-устройство, подойдёт: если у вашего ноутбука есть последовательный порт RS-232 или адаптер USB-to-serial, вы можете легко использовать его для сеансов командной строки, но вам потребуется оборудование, которое бы действовало как терминал на другом конце последовательного кабеля.
Во многих дистрибутивах Linux требуется минимальная настройка. Например, в современных дистрибутивах с использованием systemd
вам обычно нужно всего лишь одна команда, чтобы система постоянно принимала входы на последовательном порту /dev/ttyS0
: systemctl enable --now [email protected]
.
Если вы готовы написать пользовательский драйвер TTY-устройства, то в основном всё возможно: если у вас есть только один провод данных и провод заземления, вы можете сделать TTY-устройство, которое принимает ввод, например, по морзе. Если вы не владеете кодом Морзе, вам, возможно, будет удобнее что-то, что может визуально отображать символы для выходной стороны, хотя 🙂
Если доступное оборудование уже поддерживается существующими драйверами и вы не хотите заниматься программированием на уровне ядра, есть способы сделать это и в пространстве пользователя. Самый простой способ – использовать возможности вашего рабочего окружения для назначения пользовательских действий клавиш на события, такие как нажатия кнопок мыши; тогда можно использовать многокнопочную игровую мышь как замену числовой клавиатуре, например.
Или вы можете взять исходный код утилит, таких как screen
или tmux
, и переписать их обработку ввода, чтобы читать с любого доступного устройства ввода (или даже с необработанного набора GPIO-выводов); утилита тогда будет обрабатывать настройку псевдо-TTY (PTY)-устройства, которое могло бы использоваться для запуска любой интерактивной программы на основе TTY с использованием вашего пользовательского оборудования для ввода.
Ответ или решение
Безопасное выполнение интерактивной программы без клавиатуры
В современных условиях, когда взаимодействие с компьютером становится необходимым, иногда возникает ситуация, когда стандартное оборудование, такое как клавиатура, недоступно. Ваша конкретная задача заключается в том, чтобы безопасно запускать интерактивные программы, такие как nmcli
, которые требуют ввода чувствительной информации, при отсутствии клавиатуры и сетевого подключения. Однако имеются альтернативные подходы для решения этой проблемы.
1. Использование эмуляцииTTY
Первым шагом является понимание того, что многие командные программы, включая nmcli
, принимают ввод через TTY-устройства. Это означает, что вместо традиционной клавиатуры можно использовать любое устройство, которое может эмулировать TTY. Вот несколько вариантов:
-
Серийный порт: Если ваш ноутбук имеет RS-232, вы можете использовать USB-to-serial адаптер для организации сеанса управления. Для этого потребуется минимальная настройка системы. Например, в дистрибутивах Linux на базе
systemd
можно вставить команду:systemctl enable --now serial-getty@ttyS0.service
Это позволит вам подключаться к вашему устройству через терминал, используя последовательный интерфейс.
-
Модернизированные устройства ввода: Если у вас есть возможности использования игровых мышей или других периферийных устройств, можно настроить их так, чтобы они посылали команды, аналогичные вводу с клавиатуры. Множество современных интерфейсов поддерживают возможность назначения действий на основе событий мыши или других методов ввода.
2. Пользовательский ввод через программное обеспечение
Если вы имеете опыт программирования, существует возможность создания программного обеспечения, которое будет работать с нестандартными методами ввода:
-
Разработка собственного TTY-драйвера: Если имеются навыки работы с ядром Linux, вы можете написать драйвер для любого доступного устройства, включая использование, например, кода Морзе. Это очень специфичный и сложный подход, но он позволит вам реализовать практически любую идею.
-
Изменение существующих утилит: Также можно взять открытый исходный код таких утилит, как
screen
илиtmux
, и адаптировать его для работы с вашим устройства ввода. Это может включать создание псевдографических устройств, поддерживающих пользовательский ввод с помощью GPIO-пинов или других устройств.
3. Использование сценариев для автоматизации
На время, пока вы ожидаете замену клавиатуры, возможно, есть смысл создать набор предварительно определенных сценариев, которые будут запускаться автоматически при включении или перезагрузке. Например, если ваша Wi-Fi сеть поддерживает автоматическое подключение, настройте её через конфигурацию NetworkManager, чтобы минимизировать необходимость ручного ввода команд.
[connection]
id=WiFiConnection
uuid=xxxx-xxxx-xxxx-xxxx
mode=infrastructure
autoconnect=true
[wifi]
mode=infrastructure
ssid=SSID
[wifi-security]
key-mgmt=wpa-psk
psk=PASSWORD
Заключение
В отсутствие клавиатуры можно использовать альтернативные методы ввода для управления интерактивными программами, обеспечивая приоритеты по безопасности и производительности. Использование TTY, настройка устройств ввода и программирование пользовательских решений позволяют обходить ограничения, связанные с аппаратным обеспечением. Важно также помнить о лучшей практике безопасности, минимизируя риск доступа к чувствительной информации и обеспечивая автоматизированное подключение к ресурсам сети.