Загрузочный USB-накопитель, на котором выполняется моя программа

У вас есть два основных способа решить эту проблему.

Перенаправить стандартный ввод с tty на ваше приложение

По умолчанию системы загружаются с tty1, вы можете отключить getty, работающий на этом tty, и использовать его ввод для ваших целей. Сначала отключите getty в системе

sudo systemctl stop getty@tty1.service
sudo systemctl disable getty@tty1.service

Вы должны сделать это из сеанса ssh или другого getty, иначе вы потеряете свой логин. Вы не упомянули свою систему, но с systemd это так -обратитесь к документации вашего дистрибутива, если это не работает для вас

Теперь нам нужно создать скрипт-оболочку, содержащий ваше приложение для перенаправления /dev/tty1на стандартный ввод вашей программы (в конце):/usr/local/bin/rxtxcomm

#!/bin/bash
/usr/bin/java -Djava.library.path=/usr/lib/jni \
  -cp /usr/share/java/RXTXcomm.jar -jar '/foo/bar.jar' 

И сделать его исполняемым с помощью:

sudo chmod +x /usr/local/bin/rxtxcomm

Затем обновите служебный файл, чтобы вместо него запускался этот скрипт. Перезапустите службу, и она должна подключить свой стандартный ввод к /dev/tty1.

Вы можете попробовать это вручную, выполнив приведенную выше команду в другом сеансе tty или ssh, но вам нужно запустить ее от имени пользователя root (или изменить разрешения на tty ). Обратите внимание, что с этим решением вы должны быть на tty1, чтобы он мог захватить любой ввод (alt+ctrl+F1 на большинстве систем ). Кроме того, для этого вы должны быть root (, служебные файлы которого по умолчанию ), или пользователь, которого вы запускаете, должен иметь доступ для чтения с tty напрямую.

Чтение непосредственно из/dev/input/

Почти все устройства в Linux доступны в виде файлов внутри /dev. Клавиатуры доступны в /dev/input/. Вы можете изменить свою программу, чтобы вместо этого читать непосредственно из этих файлов -, которые можно читать как из любых файлов, но создавать двоичные данные, поэтому для ввода символов требуется немного больше работы.

Вот короткий пример Java, взятый из этого вопроса о переполнении стека .

// replace path with path from your system
DataInputStream in = new DataInputStream(
    new FileInputStream("/dev/input/by-id/usb-0430_0005-event-kbd"));
String map = "    abcdefghijlkmnopqrstuvwxyz                                                                                                                                                                                                                                                                ";
// sizeof(struct timeval) = 16
byte[] timeval = new byte[16];
short type, code;
int value;
while (true) {
    in.readFully(timeval);
    type = in.readShort();
    code = in.readShort();
    value = in.readInt();
    System.out.printf("%04x %04x %08x %c\n", type, code, value, 
                                             map.charAt(value>>>24));
}

Преимущество этого метода заключается в подключении к определенной клавиатуре -, поэтому вы можете подключить другую клавиатуру, не мешая работе скрипта. Что может быть полезно для отладки системы. Это также означает, что вам не нужно отключать tty или принудительно использовать определенный tty, чтобы приложение работало. Однако вам по-прежнему необходимо работать с правами root или изменять разрешения устройств, чтобы другой пользователь имел к ним прямой доступ.

-1
26.12.2019, 16:50
1 ответ

Этот метод должен работать, и я думаю, что он достаточно прост

  • Создайте постоянный живой диск из iso-файла Ubuntu с помощью инструмента mkusb .

  • Затем установите необходимые инструменты и выполните настройку.

  • После этого вы можете создать образ этого диска.

  • Наконец, клонируйте образ на другие USB-накопители (, размер которых не меньше размера USB-накопителя с исходной системой ). Вы можете распространять эти клонированные диски среди конечных пользователей вашей системы.

    Также можно разрешить конечным пользователям загружать сжатую версию образа и извлекать ее на собственные USB-накопители. mkusb может делать это непосредственно из изображений, сжатых сgzip(более быстрым )иxz(лучшим сжатием ), но это можно сделать и другими инструментами, при необходимости также в Windows.

0
28.01.2020, 05:11

Теги

Похожие вопросы