Skip to main content
  1. Concetti/

POSIX - Portable Operating System Interface

·3 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

Cosa fa
#

Standard IEEE (Institute of Electrical and Electronics Engineers) che definisce un contratto comune per sistemi operativi Unix-like. Specifica il comportamento di shell, comandi, variabili speciali, chiamate di sistema e utility. Garantisce che uno script o un programma scritto su un sistema POSIX-compliant funzioni su qualsiasi altro.

TL;DR
#

Analogia OOP:

POSIX (interfaccia)
      ├── bash  (implementazione) → rispetta il contratto
      ├── zsh   (implementazione) → rispetta il contratto
      ├── sh    (implementazione) → rispetta il contratto
      └── dash  (implementazione) → rispetta il contratto

Come un'interfaccia in OOP: ogni implementazione e' diversa
ma tutte espongono gli stessi metodi ($0, $1, $?, grep, find...)

Perche' esiste
#

Negli anni '80 esistevano decine di varianti Unix incompatibili:

SunOS    → le sue variabili, i suoi comandi
HP-UX    → varianti diverse
AIX      → ancora diverso
BSD      → ancora diverso
→ uno script scritto per SunOS non girava su HP-UX

POSIX ha standardizzato il contratto comune. Linux non e' certificato POSIX ufficialmente ma e' POSIX-compatible nella pratica.

Distro grande (Ubuntu)   → bash + zsh + sh + dash + ...
Distro minimale (Alpine) → solo sh (busybox)
Container scratch        → solo sh o niente
Router embedded          → solo sh

Ma TUTTI implementano POSIX
$0, $1, $?, grep, find, cat funzionano ovunque

un container Docker "scratch" da 5MB non può permettersi bash da 1MB quando sh da 50KB fa il lavoro base.


Cosa standardizza POSIX
#

1. Variabili speciali della shell
#

VariabileContenuto
$0Nome della shell o dello script corrente
$1, $2...Argomenti posizionali
$@Tutti gli argomenti come lista
$#Numero di argomenti
$?Exit code dell'ultimo comando (0 = successo)
$$PID della shell corrente
$!PID dell'ultimo processo in background

Queste variabili funzionano identicamente in bash, zsh, sh e dash.

2. Character classes nelle regex
#

POSIX definisce classi di caratteri portabili per le espressioni regolari:

:alpha:   → lettere (a-z, A-Z) — indipendente dalla locale
:digit:   → cifre (0-9)
:space:   → spazi, tab, newline
:upper:   → maiuscole
:lower:   → minuscole
:alnum:   → lettere e cifre
:punct:   → punteggiatura
:print:   → caratteri stampabili

# Perche' preferire :alpha: a [a-zA-Z]?
# [a-zA-Z] dipende dalla locale del sistema
# su un sistema con locale it_IT potrebbe includere caratteri accentati
# :alpha: e' definito dallo standard — sempre consistente

3. Comandi standard
#

ls, grep, find, cat, sort, uniq, cut, awk, sed — tutti definiti da POSIX con comportamento garantito.

4. Exit codes
#

0    → successo
1    → errore generico
2    → uso errato del comando (argomenti sbagliati)
126  → permesso negato (file non eseguibile)
127  → comando non trovato
128+ → terminato da segnale (128 + numero segnale)

POSIX vs bash-specific
#

Non tutto quello che funziona in bash e' POSIX:

# POSIX — funziona ovunque
if [ "$var" = "valore" ]; then

# bash-specific — non funziona in sh o dash
if "$var" == "valore"; then

# POSIX
for i in $(seq 1 10); do

# bash-specific
for i in {1..10}; do

Quando scrivi #!/bin/bash usi bash. Quando scrivi #!/bin/sh prometti che usi solo POSIX — e su molti sistemi /bin/sh e' dash, non bash.


Perche' e' importante per Blue Team
#

Gli script di sistema, i cron job e gli script di init usano quasi sempre #!/bin/sh — POSIX puro. Capire la differenza tra POSIX e bash-specific aiuta a:

  • Leggere script di sistema senza confusione
  • Scrivere script portabili che girano su qualsiasi sistema
  • Capire perche' certi script falliscono su sistemi embedded o container minimali

Dove l'ho incontrato
#

  • bandit-32 — variabili speciali POSIX ($0) per escape da shell ristretta
  • Script bash durante lo studio — $1, $?, $@ usati regolarmente

Collegato a
#

Related