Hacker Lang
Interpretowany język programowania dla HackerOS (Debian-based).
Własna składnia, statycznie kompilowana binarka hl, wbudowany linter i REPL.
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…).
Dostępność
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.
hl version
Szybki start
/// 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
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
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 tekst generuje błąd interpretera.
Linter automatycznie sugeruje zamianę na ~> tekst.
~> Zwykły tekst ~> Wartość zmiennej: @nazwa ~> Host: @target, Port: @port ~> Wersja HL: @HL_VERSION
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.
::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
Komendy — > ^ ->
Hacker Lang oferuje siedem trybów uruchamiania komend systemowych, różniących się uprawnieniami, interpolacją zmiennych i poziomem izolacji:
Zwykłe wykonanie komendy. Dziedziczy środowisko powłoki.
Wykonanie z sudo. Wymaga uprawnień root.
Izolowany namespace Linux unshare. Oddzielny mount/pid/net.
Izolowany namespace + sudo. Maksymalna izolacja.
Komenda z interpolacją zmiennych @nazwa.
Interpolacja zmiennych + sudo.
Interpolacja zmiennych + izolacja namespace.
% 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
-> i ^-> używają
unshare --mount --pid --net --fork. Komenda uruchamiana jest
w oddzielnych przestrzeniach nazw Linuksa, bez dostępu do sieci hosta.
> sudo cmd jest automatycznie wykrywane
i sugeruje zamianę na natywny operator ^> cmd.
Zmienne — % i @
| Operator | Rola | Przykład |
|---|---|---|
| % name = val | Deklaracja zmiennej | % target = 10.0.0.1 |
| @name | Odwołanie / interpolacja | ~> Host: @target |
% host = 192.168.1.1 ;; string % port = 8080 ;; liczba % debug = true ;; bool % path = /tmp/audit/@host ;; interpolowany string ~> Skanowanie @host:@port → @path
Zmienne systemowe
| Zmienna | Wartość |
|---|---|
| @HL_VERSION | Wersja interpretera (np. 0.3) |
| @HL_OS | HackerOS/Debian |
| @HL_SCRIPT | Ścieżka do bieżącego skryptu |
| @HL_SHELL_MODE | true gdy uruchomiony jako powłoka systemowa |
| @argc | Liczba argumentów skryptu |
| @arg0, @arg1… | Argumenty przekazane do skryptu |
| @SHELL | Ścieżka do binarki hl (w trybie shell) |
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).
: 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
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.
> 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
| Konstrukcja | Warunek wykonania |
|---|---|
| ? ok ... done | Ostatnia komenda zwróciła exit 0 |
| ? err ... done | Ostatnia komenda zwróciła exit > 0 |
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.
// nmap ;; wymagany nmap // curl ;; wymagany curl // whois ;; wymagany whois // john ;; John the Ripper
Kolejność instalacji: apt-get → sudo apt-get → sudo lpm
// i wyświetla podpowiedź.
Biblioteki — #
Operator # importuje biblioteki — wbudowane standardowe (std/*)
lub zewnętrzne z GitHuba (owner/repo).
Opcjonalnie można zaimportować konkretny moduł: # std/net <- ports.
# 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
| Biblioteka | Zmienne i funkcje |
|---|---|
| std/net | NET_LOCALHOST, NET_GATEWAY, NET_IFACE, NET_MYIP, net_ping() |
| std/net ← ports | PORT_SSH, PORT_HTTP, PORT_HTTPS, PORT_FTP, PORT_DNS… |
| std/fs | FS_HOME, FS_TMP, FS_ETC, FS_VAR_LOG, FS_PROC |
| std/sys | SYS_OS, SYS_VERSION, SYS_ARCH, SYS_KERNEL, SYS_HOSTNAME, SYS_CPU, SYS_MEMTOTAL |
| std/crypto | CRYPTO_SHA256_CMD, CRYPTO_MD5_CMD, CRYPTO_GPG_CMD |
| std/proc | PROC_SELF_PID, PROC_PPID |
CLI — binarka 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
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
✓ user@hackeros ~/projekt hl main » _
Wbudowane komendy powłoki
| Komenda | Opis |
|---|---|
| cd [ścieżka] | Zmień katalog roboczy |
| vars | Wyświetl wszystkie zadeklarowane zmienne |
| funcs | Wyświetl wszystkie zdefiniowane funkcje |
| help | Skrócona dokumentacja składni |
| clear / cls | Wyczyść terminal |
| exit [n] | Wyjdź z powłoki (opcjonalny kod wyjścia) |
Skróty klawiszowe
| Skrót | Działanie |
|---|---|
| Ctrl+D | Wyjście z powłoki |
| Ctrl+C | Anulowanie bieżącego wejścia |
| Tab | Autouzupełnianie (operatory HL + pliki) |
| ↑ / ↓ | Historia komend |
| Ctrl+R | Wyszukiwanie w historii |
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.
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.
Architektura projektu
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/…
Przykłady
Audyt sieciowy
/// 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
/// 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
/// 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
Komentarze —
;; /// //\\