Перейти к содержимому

Вся активность

Этот поток обновляется автоматически     

  1. Ранее
  2. Nepgear

    Оффтоп

    Вспомнил пароль.
  3. Мне давно хотелось разобраться в работе протокола SSH, однако, это казалось очень сложной задачей, поэтому тогда я ограничился написанием клиента для древнего протокола telnet. Теперь же я решил разобраться в базовых принципах криптографии и накодить полноценный SSH-клиент под OpenComputers с нуля, включая все криптографичиские алгоритмы. Установить программу в OpenOS можно командой wget -f https://raw.githubusercontent.com/Smok1e/oc-ssh/refs/heads/master/installer.lua /tmp/get-ssh.lua && /tmp/get-ssh.lua Использование программы схоже с клентом OpenSSH. Для подключения к удаленному терминалу достаточно написать ssh user@address. Разумеется, можно сменить порт или включить логирование: Usage: ssh [OPTIONS] destination [COMMAND] Available options: -h, --help: Print usage information and exit -v, --verbose: Enable debug logging --port=<port>: Override port Клиент поддерживает авторизацию по ключу. На данный момент из алгоритмов цифровой подписи реализован только Ed25519. Чтобы сгенерировать пару ключей, используйте команду ssh-keygen. По дефолту она запишет пару ключей в директорию /home/.ssh под названиями id_ed25519 и id_ed25519.pub. Публичный ключ соответствует формату OpenSSH и его можно спокойно вписать в конец файла ~/.ssh/authorized_keys на удалённой машине. Приватный ключ, однако, не совместим с OpenSSH, поэтому скопировать имеющийся приватный ключ, сгенерированный OpenSSH, в OpenOS, не получится. По аналогии с OpenSSH можно также создать файл конфигурации /home/.ssh/config. В нем можно прописать хосты для быстрого подключения в следующем формате: { Host = { address = "192.168.1.128", port = 122, user = "smok1e", identity = /path/to/private/key } } , после чего к нему можно будет подключиться командой ssh Host. Все поля в файле конфигурации, кроме адреса, опциональны. Если поле встречается как в конфиге, так и в опциях командной строки, например, порт, приоритет будет отдаваться опции командной строки. На данный момент реализованы следующие криптографические алгоритмы: X25519 для обмена ключами по Диффи-Хеллману Ed25519 для цифровой подписи при проверке хоста и авторизации по ключу AES128/192/256 в режиме CTR для шифрования между клиентом и сервером HMAC-SHA2-224/256/384/512 для проверки подленности сообщений Алгоритм сжатия не предусмотрен. Хотя текущая реализация самого протокола SSH вполне достаточна для полноценной работы с удаленным терминалом, сам эмулятор терминала допилен не до конца. Разумеется, функционала встроенной в OpenOS библиотеки term.lua недостаточно для корректной обработки большинства современных консольных программ. По-хорошему необходима полноценная реализация xterm-совместимого терминала. Проблема в том, что как такового стандарта, описывающего все escape-последовательности, которые должен обрабатывать терминал, называющий себя xterm-ом, не существует. Более того, существует невообразимое количетво различных надстроек и модификаций, усложняющих разработку в разы. Пока что реализована только базовая обработка escape-последовательностей по типу перемещения курсора и установки цвета текста, в связи с чем не все программы могут отображаться корректно.
  4. Выкладываю свой вариант программы под eeprom. local function clear_screen() gpu.fill(1, 1, 50, 16, " ") end local function proxy(c) local ad = component.list(c)() if ad then return component.proxy(ad) else error(string.format("Component: %s, is not found!", c)) end end gpu = proxy("gpu") gpu.bind(component.list("screen")(), true) gpu.setResolution(50, 16) clear_screen() --------------- Константы ---------------- local chamber_component = proxy("reactor_chamber") local redstone_component = proxy("redstone") local me_interface = proxy("me_interface") local temperature_controll = true local max_heat_reactor = 9500 local soft_sleep = 0.1 local redstone_side_output = 1 local reactor_enable_status = true computer.addUser("nickname") local reactor_scheme = { ["rod_slots"] = { 1, 3, 4, 6, 7, 8, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 23, 24, 25, 26, 29, 30, 31, 32 ,34 ,35 , 36, 37,38, 40, 41 ,42 ,43, 45,47,48,49,51,52,54 }, ["LZH_slots"] = { 2, 5, 9, 11, 16, 22, 27, 28, 33, 39, 44, 46, 50, 53 } } --------------- Константы ---------------- local function redstone_toggle(enable_status) redstone_component.setOutput(redstone_side_output, enable_status == "OFF" and 0 or 15) end local function sleep(timeout) local deadline = computer.uptime() + (timeout or math.huge) repeat computer.pullSignal(deadline - computer.uptime()) until computer.uptime() >= deadline end function error_handle(text) clear_screen() gpu.set(1, 8, text) while true do computer.beep(500, 1) if reactor_enable_status or chamber_component.isActive() then redstone_toggle("OFF") reactor_enable_status = false end while true do sleep(0.2) computer.beep(1000, 1) local s = { computer.pullSignal(0) } if s and s[3] == 57 then break end end end end local function draw_status(msg) gpu.fill(1, 1, 50, 15, "*") gpu.set(1, 8, msg) end local function replace_item(chamber_slots, slots_scheme, take_slot, dmg, id) for _, i in pairs(slots_scheme) do if not chamber_slots[i] or chamber_slots[i].dmg >= dmg and chamber_slots[i].id == id then if reactor_enable_status then redstone_toggle("OFF") reactor_enable_status = false -- продвинутый сон while chamber_component.isActive() do sleep(0.1) end end if not me_interface.pullItem("DOWN", i) and chamber_slots[i] then error_handle("ME is FULL") else ::try_again:: local s, e = pcall(me_interface.pushItemIntoSlot, "DOWN", take_slot, 1, i) if not s then error_handle(e) elseif type(e) == "number" and e == 0 and not chamber_component.getStackInSlot(i) then draw_status("ITEM ENDED, try_again") computer.beep(500, 0.1) goto try_again else draw_status("REPLACE ITEMS") end end end end if not reactor_enable_status then redstone_toggle("ON") reactor_enable_status = true draw_status("RK WORK") end end do computer.beep(666, 0.2) while true do sleep(soft_sleep) local s = { computer.pullSignal(0) } if s and s[3] == 48 then redstone_toggle("OFF") clear_screen() gpu.set(1, 8, "RK OFF") while true do sleep(0.2) computer.beep(1000, 1) local s = { computer.pullSignal(0) } if s and s[3] == 57 then draw_status("RK WORK") redstone_toggle("ON") break end end end if chamber_component.getHeat() > max_heat_reactor and temperature_controll then error_handle("REACTOR TEMP OVERHEAT") end local s, chamber_slots = pcall(chamber_component.getAllStacks, false) if not s then error_handle(chamber_slots) end replace_item(chamber_slots, reactor_scheme["LZH_slots"], 4, 8700, "IC2:reactorCondensatorLap") replace_item(chamber_slots, reactor_scheme["rod_slots"], 3, 0, "IC2:reactorUraniumQuaddepleted") end end
  5. Дубль. Какой из них лишний?
  6. Вообщем в последнем конвертаторе нету OCIF4 ток 5-6-7 ну и 8 но мне надо иммено 4 у кого-то остался конвертатор с потдержкой OCIF4 просто всё перерыл но так и не нашёл
  7. @Doob Привет! Слушай не мог бы ты помочь с командами а именно как правильно вписывать (breake,place и тд)
  8. Установить библиотеку для активации документации, в документации есть вся нужная информация. Вот пример оттуда. while true do if robot_commands.amount() > 1 then robot_commands.remove(1) end robot_commands.add("stay", "-1 56 10") sleep(20) robot_commands.remove(1) robot_commands.add("stay", "10 56 10") sleep(120) end
  9. Нужна помощь с движением робота в моде Nora Robotics / Robotized (Minecraft 1.20.1, Lua)(я пытался заставить его двигаться, разными способами( а именно как дрон из open computer и как черппшку из cc:tweaked)
  10. eu_tomat

    beeplib

    Собственно, это и требуется для описания. А не абьюз, которого нет.
  11. Oleshe

    beeplib

    Микроконтроллер используется исключительно для воспроизведения beep звука, а обычный компьютер, который обладает соответствующей библиотекой, распределяет все эти beep по микроконтроллерам, чтоб самому работать во время воспроизведения звука. Не на каждом сервере стоит мод для звуковой карты.
  12. Oleshe

    beeplib

    Абьюз микроконтроллеров для computer.beep Комплектация микроконтроллеров должна содержать любую сетевую карту и достаточно ОЗУ, чтобы открыть порт, а EPPROM должен быть прошит файлом microBeep.lua. Исполняющий библиотеку компьютер так же должен быть в состоянии открыть порт и отправить сообщение. В файле beeptest.lua демонстрируется работа. Сначала задаём порт (По умолчанию 255), потом задаём массив: первые 3 символа адресов сетевых карт наших микроконтроллеров, а далее update() для актуализации информации в библиотеке. Далее — просто beep, как в обычном computer.beep. Внутри оно просто распределяет и определяет, занят ли микроконтроллер, если да — ищет другой. Не находит — звук не воспроизводится и возвращается false. beeplib.luabeeptest.luamicroBeep.lua
  13. Здравствуйте! Хочу сообщить, что я вернулся к работе над моим проектом и успел внести некоторые улучшения в алгоритм движения робота. У меня готов новый вариант кода, который: Сокращает количество поворотов — робот больше не делает лишние движения направо-налево для проверки пространства Оптимизирует процесс — алгоритм стал более эффективным и компактным по сравнению с предыдущей версией Однако важно отметить, что новая версия имеет определённое ограничение: поскольку алгоритм больше не использует правило правой руки, могут возникнуть сложности с прохождением некоторых типов лабиринтов. Существует вероятность зацикливания в определённых конфигурациях лабиринта. Я подготовил обновлённый код и готов поделиться им с вами для тестирования и обсуждения возможных решений по устранению проблемы с зацикливанием. С уважением, [Фарадей] Новый код: local robot = require("robot") while true do -- Основной цикл с пошаговым движением if not robot.detect() then -- Двигаться вперед, если нет препятствия robot.forward() else -- Если впереди стена - использовать стратегию правой руки robot.turnRight() while robot.detect() do -- Поворачивать налево, пока не найдется проход robot.turnLeft() end -- Когда проход найден - двигаться в этом направлении robot.forward() end os.sleep(0.2) end Установить можно так же, как в инструкции выше.
  14. На самом деле странно, так как без использования цикла оно должно отрабатывать только один раз, суть то простая - ждём пока изменится сигнал редстоуна (через os.pullEvent), читаем значения, всё. Перепроверил сейчас внутри майнкрафта, всё работает, да и по идее не может оно не работать при простом добавлении цикла. оно ошибки не выдавало никакие?
  15. Я пока только начал работать с CC, но моей основной целью было создание автокрафта на черепашке. Я отказался использовать для хранения сундуки, поэтому решил использовать Storage Drawers. И тут я столкнулся с такой проблемой, что компютер не выводит данные с дроверов. Я могу положить туда предметы, но когда я пытаюсь получить хотя бы список предметов (пытался получить список даже из дровера вплотную к компьютеру), то ничего не получал. local ch0 = peripheral.wrap("minecraft:chest_0") local Adr = peripheral.wrap("storagedrawers:standard_drawers_1_3") local ch1 = peripheral.wrap("minecraft:chest_1") local chN = peripheral.getName(ch1) local dr1 = peripheral.wrap("right") --for i,v in ipairs(peripheral.getMethods("storagedrawers:controller_3")) do -- print(i.. " "..v) --end for i, item in ipairs(dr1.list()) do for k,v in pairs(item) do print(i,k,v) end end вот этот простенький код. Каюсь цикл с ipairs я нашёл в инете, поэтому пока не совсем понимаю, как он работает, но с обычными сундуками он выдавал информацию хоть какую-то. Смиренно прошу помощи в понимании.
  16. Вы не знаете, как посмотреть из-за какого игрока взорвался крипер?
  17. получилось так но со строчкой while true do не работает лампочка загорается
  18. Да теперь он показывает 1 и 0 но как мне это встроить в мой код? или как правильно должен выглядеть этот код
  19. Возможно, я открыл кривую документацию. Сам я сейчас далеко от Майнкрафта, поэтмоу проверять не буду. Я, кажется, понял. Если whitein является числом, то такое сравнение некорректно. Убери кавычки от единицы.
  20. документация к cc tweaked говорит что оно таки возвращает число, но если оно работает в "режиме луа" (я так понимаю имеется ввиду repl), но не работает само по себе - дело может быть не в возвращаемых значениях. Думаю в данном случае стоит проверить вот такой вариант: while true do os.pullEvent("redstone") print(rs.getBundledInput("back", colors.white)) end
  21. А я пока не знаю, что там у тебя происходит. Попробуем двигаться малыми шагами. Как ты выполняешь проверку в режиме Lua?
  22. Не неработает. Я вообще незнаю что делать
  1. Загрузить больше активности
×
×
  • Создать...