HackerOS — język skryptowy

Hacker Lang

Interpretowany język programowania dla HackerOS (Debian-based).
Własna składnia, statycznie kompilowana binarka hl, wbudowany linter i REPL.

wbudowany w HackerOS tylko dla HackerOS pliki .hl v0.3
01

Czym jest Hacker Lang?

Hacker Lang (HL) to interpretowany język programowania napisany w Rust, zaprojektowany jako natywny język skryptowy systemu HackerOS (oparty na Debianie). Pliki źródłowe mają rozszerzenie .hl.

HL łączy własną składnię operatorową z bezpośrednim dostępem do powłoki systemowej, wbudowanym linterem, bibliotekami standardowymi (std/net, std/sys…) oraz ponad 40 quick-funkcjami (::upper, ::len, ::rand…).

source.hl ──► Lexer ──► Parser (AST) ──► Linter ──► Executor ──► System
02

Dostępność

🔒
Hacker Lang jest wbudowany w HackerOS. Nie wymaga instalacji — binarka hl jest częścią systemu od pierwszego uruchomienia. HL nie jest przeznaczony do użytku poza HackerOS.

Po uruchomieniu HackerOS interpreter hl jest od razu dostępny w terminalu. Możesz zacząć pisać skrypty .hl bez żadnej konfiguracji.

SPRAWDŹ WERSJĘ
hl version
03

Szybki start

hello.hl
/// Mój pierwszy skrypt w Hacker Lang

// curl

% name    = HackerOS
% version = 0.3

~> Witaj w @name v@version!

: greet def
    ~> Kernel:
    > uname -r
    ::upper @name
done

-- greet

? ok
    ~> System gotowy ✓
done
BASH — uruchomienie
hl hello.hl              # uruchom skrypt
hl repl                  # interaktywna powłoka REPL
hl shell                 # HL jako powłoka systemowa (zamiennik bash)
hl check hello.hl        # sprawdź składnię + linter
hl ast hello.hl          # wydrukuj AST (JSON)
hl -c "~> Hej!"          # jednolinijkowy kod
hl lib list              # lista dostępnych bibliotek
hl --help                # pomoc
04

Wyjście — ~>

Operator ~> to jedyny sposób wypisywania tekstu na stdout w Hacker Lang. Używanie echo wewnątrz bloków komend jest zakazane i spowoduje błąd kompilatora.

🚫
echo jest zabronione. Użycie > echo tekst generuje błąd interpretera. Linter automatycznie sugeruje zamianę na ~> tekst.
SKŁADNIA ~>
~> Zwykły tekst
~> Wartość zmiennej: @nazwa
~> Host: @target, Port: @port
~> Wersja HL: @HL_VERSION
05

Quick-funkcje — ::

Operator :: wywołuje wbudowane funkcje bezpośrednio z interpretera. Wynik trafia na stdout i ustawia last_exit — można go sprawdzić blokiem ? ok.

SKŁADNIA :: quick-call
::upper   hello world      ;; → HELLO WORLD
::lower   @name            ;; → wartość @name małymi literami
::len     @text            ;; → długość stringa
::trim    @input           ;; → usunięte spacje z boków
::rev     hacker           ;; → rekcah
::replace @text old new   ;; → zamień wszystkie wystąpienia
::contains @text wzorzec ;; → true/false, exit code 0/1
::split   @text :         ;; → każda część w nowej linii
::max     10 20            ;; → 20
::rand                     ;; → losowa liczba 0-99
::date                     ;; → 2025-01-01
::exists  /etc/passwd      ;; → exit 0 jeśli plik istnieje
::basename /tmp/audit.log  ;; → audit.log
::green   Sukces!          ;; → kolorowy output
::hr      40               ;; → ────────────────────────────────────────
::set     result ok        ;; → ustaw zmienną @result = "ok"
::get     result           ;; → wypisz wartość @result
::type    port             ;; → "number"

Wszystkie wbudowane quick-funkcje

::uppertekst → WIELKIE LITERY
::lowertekst → małe litery
::lendługość stringa
::trimusuń białe znaki
::revodwróć string
::repeattekst N razy
::replacezamień podstring
::containssprawdź zawieranie
::startswithsprawdź prefix
::endswithsprawdź suffix
::splitpodziel po separatorze
::linespodziel po liniach
::wordspodziel po słowach
::abswartość bezwzględna
::ceilzaokrąglij w górę
::floorzaokrąglij w dół
::roundzaokrąglij
::maxwiększa z dwóch liczb
::minmniejsza z dwóch
::randlosowa liczba 0-99
::envzmienna środowiskowa
::datebieżąca data
::timebieżący czas
::pidPID procesu HL
::whichścieżka do narzędzia
::existssprawdź czy ścieżka istnieje
::isdirczy to katalog?
::isfileczy to plik?
::basenamenazwa pliku
::dirnamekatalog nadrzędny
::readodczytaj plik
::setustaw zmienną
::getpobierz zmienną
::typetyp zmiennej
::unsetusuń zmienną
::nlpusta linia
::hrpozioma linia
::boldpogrubiony tekst
::redczerwony tekst
::greenzielony tekst
::yellowżółty tekst
::cyancyjanowy tekst
06

Komendy — > ^ ->

Hacker Lang oferuje siedem trybów uruchamiania komend systemowych, różniących się uprawnieniami, interpolacją zmiennych i poziomem izolacji:

> komenda

Zwykłe wykonanie komendy. Dziedziczy środowisko powłoki.

^> komenda

Wykonanie z sudo. Wymaga uprawnień root.

-> komenda

Izolowany namespace Linux unshare. Oddzielny mount/pid/net.

^-> komenda

Izolowany namespace + sudo. Maksymalna izolacja.

>> komenda @var

Komenda z interpolacją zmiennych @nazwa.

^>> komenda @var

Interpolacja zmiennych + sudo.

->> komenda @var

Interpolacja zmiennych + izolacja namespace.

PRZYKŁADY KOMEND
% target = 192.168.1.1
% port   = 22

>  ls -la /tmp
^> apt-get update
-> curl -s http://test.internal
^-> nmap -sS 10.0.0.0/24
>> nmap -p @port @target
^>> ssh @user@@target
->> curl -s http://@target
🔒
Izolacja namespace: tryby -> i ^-> używają unshare --mount --pid --net --fork. Komenda uruchamiana jest w oddzielnych przestrzeniach nazw Linuksa, bez dostępu do sieci hosta.
💡
Linter: użycie > sudo cmd jest automatycznie wykrywane i sugeruje zamianę na natywny operator ^> cmd.
07

Zmienne — % i @

OperatorRolaPrzykład
% name = valDeklaracja zmiennej% target = 10.0.0.1
@nameOdwołanie / interpolacja~> Host: @target
TYPY WARTOŚCI
% host    = 192.168.1.1        ;; string
% port    = 8080               ;; liczba
% debug   = true               ;; bool
% path    = /tmp/audit/@host   ;; interpolowany string

~> Skanowanie @host:@port@path

Zmienne systemowe

ZmiennaWartość
@HL_VERSIONWersja interpretera (np. 0.3)
@HL_OSHackerOS/Debian
@HL_SCRIPTŚcieżka do bieżącego skryptu
@HL_SHELL_MODEtrue gdy uruchomiony jako powłoka systemowa
@argcLiczba argumentów skryptu
@arg0, @arg1…Argumenty przekazane do skryptu
@SHELLŚcieżka do binarki hl (w trybie shell)
08

Funkcje — : i --

Funkcje definiuje się operatorem :, po którym następuje nazwa i słowo def. Ciało funkcji kończy się słowem done. Wywołanie to -- nazwa. Funkcje są przechowywane jako Arc<Vec<Node>> — wywołanie O(1).

SKŁADNIA FUNKCJI
: perform_audit def
    ~> Rozpoczynam skan @target...
    ::hr 40

    >> nmap -sV -T4 @target

    ? ok
        ::green Skan zakończony pomyślnie.
    done

    ? err
        ::red Błąd podczas skanowania!
    done
done

;; Wywołanie funkcji:
-- perform_audit
09

Logika — ? ok / ? err

Bloki warunkowe sprawdzają last_exit — kod wyjścia ostatnio wykonanej komendy lub quick-funkcji. ? ok uruchamia blok gdy exit = 0, ? err gdy exit ≠ 0.

PRZYKŁADY LOGIKI
> ping -c 1 192.168.1.1

? ok
    ::green Host online ✓
    >> nmap -sV @target
done

? err
    ::red Host niedostępny ✗
    ~> Sprawdź połączenie sieciowe.
done

;; Quick-funkcje też ustawiają exit code:
::contains @text error

? ok
    ~> Znaleziono błąd w tekście
done
KonstrukcjaWarunek wykonania
? ok ... doneOstatnia komenda zwróciła exit 0
? err ... doneOstatnia komenda zwróciła exit > 0
10

Komentarze — ;; /// //

WSZYSTKIE TYPY KOMENTARZY
;; To jest komentarz liniowy — ignorowany w runtime

/// Komentarz dokumentacyjny — zachowany w AST (dla narzędzi)

// To jest komentarz wieloliniowy
   może rozciągać się na wiele linii
   kończy się dwoma backslashami \\
SkładniaTypOpis
;; tekstLiniowyIgnorowany w runtime i AST
/// tekstDokumentacyjnyZachowany w AST dla narzędzi
// tekst \\BlokowyWieloliniowy — ends with \\
11

Zależności — // pakiet

Operator // (bez domknięcia \\) deklaruje zależność systemową. Interpreter sprawdza dostępność w PATH i automatycznie próbuje zainstalować brakujące narzędzie.

DEKLARACJA ZALEŻNOŚCI
// nmap    ;; wymagany nmap
// curl    ;; wymagany curl
// whois   ;; wymagany whois
// john    ;; John the Ripper

Kolejność instalacji: apt-getsudo apt-getsudo lpm

📦
Linter automatycznie wykrywa użycie popularnych narzędzi (nmap, curl, wget, john, hydra…) bez wcześniejszej deklaracji // i wyświetla podpowiedź.
12

Biblioteki — #

Operator # importuje biblioteki — wbudowane standardowe (std/*) lub zewnętrzne z GitHuba (owner/repo). Opcjonalnie można zaimportować konkretny moduł: # std/net <- ports.

IMPORT BIBLIOTEK
# std/net              ;; IP, gateway, iface, porty, net_ping()
# std/net <- ports     ;; tylko stałe portów (PORT_SSH, PORT_HTTP…)
# std/net <- dns       ;; stałe DNS (NET_DNS1, NET_DNS2)
# std/fs               ;; FS_HOME, FS_TMP, FS_ETC…
# std/sys              ;; SYS_OS, SYS_KERNEL, SYS_ARCH, SYS_CPU…
# std/str              ;; STR_NEWLINE, STR_TAB, STR_EMPTY
# std/crypto           ;; CRYPTO_SHA256_CMD, CRYPTO_GPG_CMD…
# std/proc             ;; PROC_SELF_PID, PROC_PPID

;; Zewnętrzna biblioteka z GitHub:
# owner/my-hl-lib      ;; klonuje repo i ładuje lib.hl
BibliotekaZmienne i funkcje
std/netNET_LOCALHOST, NET_GATEWAY, NET_IFACE, NET_MYIP, net_ping()
std/net ← portsPORT_SSH, PORT_HTTP, PORT_HTTPS, PORT_FTP, PORT_DNS…
std/fsFS_HOME, FS_TMP, FS_ETC, FS_VAR_LOG, FS_PROC
std/sysSYS_OS, SYS_VERSION, SYS_ARCH, SYS_KERNEL, SYS_HOSTNAME, SYS_CPU, SYS_MEMTOTAL
std/cryptoCRYPTO_SHA256_CMD, CRYPTO_MD5_CMD, CRYPTO_GPG_CMD
std/procPROC_SELF_PID, PROC_PPID
13

CLI — binarka hl

WSZYSTKIE POLECENIA hl
hl [PLIK.hl] [ARGS...]     # uruchom skrypt
hl run PLIK.hl [ARGS...]   # uruchom (jawna forma)
hl repl                    # interaktywna powłoka REPL
hl shell                   # HL jako powłoka systemowa (zamiennik bash)
hl shell -c "~> inline"    # wykonaj komendę i wyjdź
hl shell --config ~/.hlrc  # powłoka z własnym configiem
hl check PLIK.hl           # sprawdź składnię + linter (exit 0 = OK)
hl ast PLIK.hl             # wydrukuj AST jako JSON
hl clean                   # wyczyść ~/.hl/cache
hl lib list                # lista zainstalowanych bibliotek
hl lib install owner/repo  # zainstaluj bibliotekę z GitHuba
hl lib remove owner/repo   # usuń bibliotekę
hl version                 # informacje o wersji
hl -c "~> Hej!"            # jednolinijkowy kod inline
hl -v PLIK.hl              # tryb verbose (debug)
hl --help                  # pomoc
14

Powłoka REPL / Shell

hl repl uruchamia interaktywną powłokę z historią komend, podświetlaniem składni i autouzupełnianiem. hl shell działa jako pełnoprawny zamiennik powłoki systemowej — ładuje ~/.hlrc i wyświetla prompt z gałęzią git.

Prompt powłoki

PRZYKŁADOWY PROMPT
✓ user@hackeros ~/projekt hl  main
» _

Wbudowane komendy powłoki

KomendaOpis
cd [ścieżka]Zmień katalog roboczy
varsWyświetl wszystkie zadeklarowane zmienne
funcsWyświetl wszystkie zdefiniowane funkcje
helpSkrócona dokumentacja składni
clear / clsWyczyść terminal
exit [n]Wyjdź z powłoki (opcjonalny kod wyjścia)

Skróty klawiszowe

SkrótDziałanie
Ctrl+DWyjście z powłoki
Ctrl+CAnulowanie bieżącego wejścia
TabAutouzupełnianie (operatory HL + pliki)
↑ / ↓Historia komend
Ctrl+RWyszukiwanie w historii
15

Diagnostyka i linter

HL posiada wbudowany linter i renderer diagnostyk wyświetlający błędy w stylu Rust — z numerami linii, podkreśleniami i sugestiami naprawy.

PRZYKŁADOWY OUTPUT LINTER
error: `echo` jest zabronione w blokach komend Hacker Lang
  --> update.hl:5:1
 5 │ > echo hello
   ^^^^^^^^^^^
  help: zamień na: `~> hello`
  note: operator `~>` to jedyny sposób wypisywania tekstu w HL

warning: użycie `> sudo apt-get update` — zamiast tego użyj `^>`
  --> update.hl:8:1
 8 │ > sudo apt-get update
   ^^^^^^^^^^^^^^^^^^^^^
  help: zamień na: `^> apt-get update`

Linter wykrywa automatycznie: użycie echo, > sudo cmd, puste definicje funkcji, oraz brakujące deklaracje // dla popularnych narzędzi sieciowych.

16

Architektura projektu

CARGO WORKSPACE — STRUKTURA
hackerlang/
├── Cargo.toml                 # workspace root
├── examples/
│   ├── hello.hl
│   └── network_audit.hl
│
├── core/                      # hacker-core (staticlib + rlib)
│   └── src/
│       ├── lib.rs             # publiczne API
│       ├── lexer.rs           # tokenizer (Token enum)
│       ├── ast.rs             # AST (Node, CommandMode, VarValue…)
│       ├── parser.rs          # lex → AST
│       ├── env.rs             # środowisko (FxHashMap vars/funcs)
│       ├── executor.rs        # wykonuje AST node po node
│       ├── quick.rs           # quick-funkcje (::upper, ::len…)
│       ├── deps.rs            # resolver zależności systemowych
│       ├── libs.rs            # biblioteki std/* i GitHub
│       └── diagnostics.rs     # linter + renderer diagnostyk
│
├── shell/                     # hacker-shell (staticlib + rlib)
│   └── src/
│       ├── lib.rs             # REPL, run_file, run_as_shell
│       ├── prompt.rs          # prompt (user@host dir git status)
│       ├── completion.rs      # rustyline: tab completion + highlight
│       └── builtins.rs        # cd, exit, vars, funcs, help, clear
│
└── cli/                       # binarka hl — statycznie linkuje core + shell
    └── src/
        └── main.rs            # clap CLI: run/repl/shell/check/ast/lib/…
17

Przykłady

Audyt sieciowy

network_audit.hl
/// Network Audit Tool — HackerOS

// nmap
// curl
// whois
# std/net <- ports
# std/sys

% target     = 192.168.1.1
% output_dir = /tmp/audit
% ports      = 1-1024

::hr 50
::bold Network Audit — HackerOS
~> System: @SYS_OS | Kernel: @SYS_KERNEL
::hr 50

: check_host def
    ~> Sprawdzam: @target
    >> ping -c 1 -W 2 @target
    ? ok
        ::green @target ONLINE ✓
    done
    ? err
        ::red @target nie odpowiada ✗
    done
done

: port_scan def
    ~> Skanuję porty @ports na @target...
    >> nmap -sV -T4 -p @ports @target
    ? ok
        ::green Skan zakończony pomyślnie.
    done
done

: isolated_probe def
    ~> Sondowanie w izolacji sieciowej...
    ->> curl -s --max-time 5 http://@target
done

^> mkdir -p @output_dir

-- check_host
-- port_scan
-- isolated_probe

::nl
~> Audyt zakończony. Wyniki: @output_dir

Aktualizacja systemu

update.hl
/// Aktualizacja systemu HackerOS
# std/sys

::bold Aktualizacja systemu @SYS_OS...
^> apt-get update

? ok
    ^> apt-get -y upgrade
    ? ok
        ::green System zaktualizowany ✓
    done
done

? err
    ::red Błąd aktualizacji. Sprawdź połączenie.
done

Import bibliotek i quick-funkcje

sysinfo.hl
/// Informacje systemowe z std/sys + std/net

# std/sys
# std/net

::hr 50
::cyan === HACKEROS SYSTEM INFO ===
::hr 50

~> OS       : @SYS_OS @SYS_VERSION
~> Kernel   : @SYS_KERNEL
~> Arch     : @SYS_ARCH
~> CPU      : @SYS_CPU rdzeni
~> RAM      : @SYS_MEMTOTAL
~> Uptime   : @SYS_UPTIME
~> Hostname : @SYS_HOSTNAME
~> IP       : @NET_MYIP
~> Gateway  : @NET_GATEWAY
~> Iface    : @NET_IFACE
~> HL ver   : @HL_VERSION

::hr 50
::date
::time