# Commands

## `<span class="editor-theme-code">cli</span>`

`<span class="editor-theme-code">cli</span>`<span style="white-space: pre-wrap;"> öffnet die </span>****eigentliche Switch-CLI****, also die FastPath-/Switching-Ebene.

Dort arbeitest du mit Dingen wie:

```
show vlan
show running-config
configure
interface 0/1
switchport mode access
vlan database
write memory
```

Das ist die Cisco-ähnliche Oberfläche für:

- VLANs
- Ports
- Trunks
- Layer-2/teilweise Layer-3
- laufende Switch-Konfiguration

<span style="white-space: pre-wrap;">Das Problem: Diese CLI verwaltet hauptsächlich den </span>****laufenden FastPath-Zustand****<span style="white-space: pre-wrap;">. </span>`<span class="editor-theme-code">write memory</span>`<span style="white-space: pre-wrap;"> meldet zwar Erfolg, aber die UniFi-Firmware baut FastPath beim Start wieder aus </span>`<span class="editor-theme-code">/tmp/system.cfg</span>`<span style="white-space: pre-wrap;"> beziehungsweise der von </span>`<span class="editor-theme-code">ubntconf</span>`<span style="white-space: pre-wrap;"> erzeugten Startup-Konfiguration auf. Deshalb verschwinden die Änderungen nach einem Reboot.</span>

---

## `<span class="editor-theme-code">mca-cli-op</span>`

`<span class="editor-theme-code">mca-cli-op</span>`<span style="white-space: pre-wrap;"> gehört zur </span>****UniFi-Management-Ebene****.

Auf deinem Switch ist es nur ein Symlink:

```
/usr/bin/mca-cli-op -> mcad
```

<span style="white-space: pre-wrap;">Es startet also das Programm </span>`<span class="editor-theme-code">mcad</span>`<span style="white-space: pre-wrap;"> in einem speziellen Betriebsmodus.</span>

`<span class="editor-theme-code">mcad</span>`<span style="white-space: pre-wrap;"> kümmert sich um Dinge wie:</span>

- Adoption
- Controller-Kommunikation
- Inform-Nachrichten
- Provisionierung
- Managementstatus
- Werksreset
- Speichern und Laden von UniFi-Konfiguration
- `<span class="editor-theme-code">mgmt.is_default</span>`
- `<span class="editor-theme-code">mgmt.is_setup_completed</span>`

Mit Argumenten wird es normalerweise als interner Einzelbefehl verwendet, zum Beispiel:

```
mca-cli-op inform
mca-cli-op set-inform http://controller:8080/inform
mca-cli-op set-default
```

<span style="white-space: pre-wrap;">Der Firmware-Wrapper ruft solche Befehle selbst auf. </span>`<span class="editor-theme-code">set-inform</span>`<span style="white-space: pre-wrap;"> wird beispielsweise direkt an </span>`<span class="editor-theme-code">mca-cli-op</span>`<span style="white-space: pre-wrap;"> weitergereicht, während </span>`<span class="editor-theme-code">set-default</span>`<span style="white-space: pre-wrap;"> einen Werksreset einleitet.</span>

Ohne Argument:

```
mca-cli-op
```

öffnet es die interaktive Management-CLI:

```
UniFi#
```

<span style="white-space: pre-wrap;">Das ist </span>****keine Linux-Shell****<span style="white-space: pre-wrap;"> und auch nicht dieselbe CLI wie </span>`<span class="editor-theme-code">cli</span>`<span style="white-space: pre-wrap;">. Deshalb kennt sie kein </span>`<span class="editor-theme-code">echo</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">awk</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">find</span>`<span style="white-space: pre-wrap;"> oder Shell-Pipes.</span>

## Vereinfacht dargestellt

```
SSH-Shell
│
├── cli
│   └── FastPath-Switch-CLI
│       ├── VLANs
│       ├── Ports
│       ├── Trunks
│       └── running-config
│
└── mca-cli-op / mcad
    └── UniFi-Management-Stack
        ├── Adoption
        ├── Provisionierung
        ├── Controller/Inform
        ├── mgmt-Konfiguration
        └── Default-/Setup-Status
```

```

```

---

## `<span class="editor-theme-code">swctrl</span>`

`<span class="editor-theme-code">swctrl</span>`<span style="white-space: pre-wrap;"> ist eine interne </span>****UniFi-Switch-Control-Utility****<span style="white-space: pre-wrap;">. Auf dem getesteten </span>`<span class="editor-theme-code">USW-Pro-48-US.7.5.6</span>`<span style="white-space: pre-wrap;"> meldet sie sich als Version </span>`<span class="editor-theme-code">0.9</span>`. Sie liest hardwarenahe Switch-Zustände aus und enthält außerdem einige direkt verändernde Funktionen.

<span style="white-space: pre-wrap;">Sie ist weder die Cisco-ähnliche </span>`<span class="editor-theme-code">cli</span>`<span style="white-space: pre-wrap;"> noch die UniFi-Management-CLI </span>`<span class="editor-theme-code">mca-cli-op</span>`<span style="white-space: pre-wrap;">. </span>`<span class="editor-theme-code">swctrl</span>`<span style="white-space: pre-wrap;"> arbeitet näher an der laufenden Switch- und Hardware-Ebene. Änderungen sind deshalb nicht automatisch eine dauerhaft vom Controller verwaltete Konfiguration.</span>

### Aufruf und Optionen

```
swctrl FUNCTION
swctrl [OPTIONS]
```

Auf diesem Firmware-Build werden folgende globale Optionen angezeigt:

- `<span class="editor-theme-code">-h</span>`<span style="white-space: pre-wrap;"> zeigt die allgemeine Hilfe.</span>
- `<span class="editor-theme-code">-v</span>`<span style="white-space: pre-wrap;"> aktiviert eine ausführlichere Ausgabe, sofern die aufgerufene Funktion zusätzliche Details bereitstellt.</span>

Die Unterbefehle sind nicht vollständig in der allgemeinen Hilfe aufgeführt. Bei vielen Funktionsgruppen zeigt ein Aufruf ohne weiteren Unterbefehl die jeweilige Syntax:

```
swctrl
swctrl -h
swctrl mac
swctrl mac block
```

### Funktionsgruppen

<span style="white-space: pre-wrap;">Die Hilfe von Firmware </span>`<span class="editor-theme-code">7.5.6</span>`<span style="white-space: pre-wrap;"> nennt diese Funktionsgruppen:</span>

- `<span class="editor-theme-code">port</span>`<span style="white-space: pre-wrap;"> – Portstatus, Linkzustand, Geschwindigkeit, Zähler und modellabhängige Portoperationen.</span>
- `<span class="editor-theme-code">poe</span>`<span style="white-space: pre-wrap;"> – PoE-Status und modellabhängige PoE-Steuerung. Die Funktionsgruppe kann auch auf Geräten ohne PoE im gemeinsamen Firmware-Binary vorhanden sein.</span>
- `<span class="editor-theme-code">env</span>`<span style="white-space: pre-wrap;"> – Umgebungs- und Hardwarewerte, beispielsweise Temperatursensoren und vorhandene Lüfterinformationen.</span>
- `<span class="editor-theme-code">mac</span>`<span style="white-space: pre-wrap;"> – gelernte MAC-/Client-Einträge sowie Block- und eine in der Hilfe genannte </span>`<span class="editor-theme-code">white</span>`-Funktionsgruppe.
- `<span class="editor-theme-code">sfp</span>`<span style="white-space: pre-wrap;"> – Status und Diagnosedaten vorhandener SFP-/SFP+-Module.</span>
- `<span class="editor-theme-code">led</span>`<span style="white-space: pre-wrap;"> – modellabhängige LED-Funktionen.</span>
- `<span class="editor-theme-code">vlan</span>`<span style="white-space: pre-wrap;"> – interne VLAN-bezogene Abfragen oder Operationen; die genaue Syntax muss mit </span>`<span class="editor-theme-code">swctrl vlan</span>`<span style="white-space: pre-wrap;"> auf dem jeweiligen Build geprüft werden.</span>
- `<span class="editor-theme-code">lldp</span>`<span style="white-space: pre-wrap;"> – LLDP-bezogene Status- und Nachbarinformationen.</span>
- `<span class="editor-theme-code">relay</span>`<span style="white-space: pre-wrap;"> – eine auf diesem Build vorhandene, aber durch die allgemeine Hilfe nicht näher erklärte Funktionsgruppe. Bedeutung und Unterbefehle müssen mit </span>`<span class="editor-theme-code">swctrl relay</span>`<span style="white-space: pre-wrap;"> geprüft werden.</span>

****Wichtig:****<span style="white-space: pre-wrap;"> Eine aufgelistete Funktionsgruppe bedeutet nicht automatisch, dass die Hardware sie unterstützt oder dass jeder Unterbefehl auf jedem Switch identisch ist. </span>`<span class="editor-theme-code">swctrl</span>`<span style="white-space: pre-wrap;"> ist stark firmware- und modellabhängig.</span>

### Typische lesende Diagnosebefehle

```
swctrl env show
swctrl poe show
swctrl sfp show
swctrl port show
swctrl port show counters
swctrl mac show
```

`<span class="editor-theme-code">port show</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">port show counters</span>`<span style="white-space: pre-wrap;"> und </span>`<span class="editor-theme-code">mac show</span>`<span style="white-space: pre-wrap;"> eignen sich besonders für Live-Diagnose, weil sie den aktuellen Zustand anzeigen und selbst keine Konfiguration ändern.</span>

### <span style="white-space: pre-wrap;">Hinweis zu </span>`<span class="editor-theme-code">poe</span>`

<span style="white-space: pre-wrap;">Der getestete </span>`<span class="editor-theme-code">USW-Pro-48</span>`<span style="white-space: pre-wrap;"> ist die Variante ohne PoE. Trotzdem kann </span>`<span class="editor-theme-code">swctrl poe show</span>`<span style="white-space: pre-wrap;"> vorhanden sein, weil dieselbe Utility auf mehreren Switch-Modellen verwendet wird.</span>

<span style="white-space: pre-wrap;">Eine leere Tabelle oder ein offensichtlich unsinniger Wert wie </span>`<span class="editor-theme-code">Total Power Limit(mW): -1091736708</span>`<span style="white-space: pre-wrap;"> ist </span>****kein gültiger Leistungswert****<span style="white-space: pre-wrap;"> und kein verlässlicher Modelltest. Solche Ausgaben müssen als nicht unterstützte, fehlerhafte oder nicht initialisierte PoE-Abfrage behandelt werden.</span>

### `<span class="editor-theme-code">mac</span>`

`<span class="editor-theme-code">swctrl mac</span>`<span style="white-space: pre-wrap;"> bündelt die MAC-/Client-Funktionen der laufenden Switch-Ebene. Auf Firmware </span>`<span class="editor-theme-code">7.5.6</span>`<span style="white-space: pre-wrap;"> zeigt die Hilfe folgende Bereiche:</span>

```
swctrl mac show [ id PORT_ID ]
swctrl mac block
swctrl mac white
```

`<span class="editor-theme-code">PORT_ID</span>`<span style="white-space: pre-wrap;"> darf einzelne Ports, Bereiche und kombinierte Listen enthalten:</span>

```
3
5-7
1,4,9-12
```

#### `<span class="editor-theme-code">mac show</span>`

`<span class="editor-theme-code">swctrl mac show</span>`<span style="white-space: pre-wrap;"> zeigt die vom Switch erfassten MAC-/Client-Einträge über alle Ports. Mit </span>`<span class="editor-theme-code">id</span>`<span style="white-space: pre-wrap;"> lässt sich die Ausgabe auf bestimmte Ports begrenzen:</span>

```
swctrl mac show
swctrl mac show id 52
swctrl mac show id 5-7
swctrl mac show id 1,4,9-12
```

Die Ausgabe enthält auf diesem Build folgende Spalten:

- `<span class="editor-theme-code">port</span>`<span style="white-space: pre-wrap;"> – Port, an dem die MAC-Adresse gelernt beziehungsweise dem Client-Eintrag zugeordnet wurde.</span>
- `<span class="editor-theme-code">vlan</span>`<span style="white-space: pre-wrap;"> – VLAN-ID des Eintrags.</span>
- `<span class="editor-theme-code">mac-address</span>`<span style="white-space: pre-wrap;"> – erkannte MAC-Adresse.</span>
- `<span class="editor-theme-code">ip-address</span>`<span style="white-space: pre-wrap;"> – zugeordnete IP-Adresse, sofern sie der Management-Software bekannt ist.</span>
- `<span class="editor-theme-code">hostname</span>`<span style="white-space: pre-wrap;"> – erkannter Hostname, sofern vorhanden.</span>
- `<span class="editor-theme-code">uptime</span>`<span style="white-space: pre-wrap;"> – interner Laufzeitwert des Eintrags. Die Hilfe definiert seine genaue Bedeutung nicht; er sollte nicht ungeprüft als Geräte-Uptime bezeichnet werden.</span>
- `<span class="editor-theme-code">age</span>`<span style="white-space: pre-wrap;"> – interner Alterswert, wahrscheinlich seit der letzten Aktualisierung oder Aktivität. Auch diese Einheit und Semantik wird von der Hilfe nicht erklärt.</span>
- `<span class="editor-theme-code">wireless-type</span>`<span style="white-space: pre-wrap;"> – optionale WLAN-/Client-Klassifizierung; bei rein kabelgebunden erkannten Einträgen bleibt das Feld häufig leer.</span>

Da die Ausgabe zusätzlich IP-Adresse, Hostname und WLAN-Metadaten enthalten kann, ist sie mehr als eine rohe Hardware-FDB. Fehlende IP- oder Hostname-Werte bedeuten nicht, dass die MAC-Adresse ungültig ist; die Zusatzinformationen sind schlicht nicht bekannt.

<span style="white-space: pre-wrap;">Mehrere MAC-Adressen auf demselben Port sind bei einem Uplink, einem nachgeschalteten Switch, einem Access Point, einer Bridge oder einem virtualisierten Host normal. Beim </span>`<span class="editor-theme-code">USW-Pro-48</span>`<span style="white-space: pre-wrap;"> sind neben 48 RJ45-Ports vier SFP+-Ports vorhanden. Ein Eintrag auf Port </span>`<span class="editor-theme-code">52</span>`<span style="white-space: pre-wrap;"> passt daher zum letzten SFP+-Port; die konkrete Portzuordnung sollte trotzdem mit </span>`<span class="editor-theme-code">swctrl port show</span>`<span style="white-space: pre-wrap;"> geprüft werden.</span>

#### `<span class="editor-theme-code">mac block</span>`

`<span class="editor-theme-code">mac block</span>`<span style="white-space: pre-wrap;"> verwaltet auf diesem Firmware-Build eine interne Blockliste. Die knappe Unterhilfe zeigt nur </span>`<span class="editor-theme-code">show</span>`<span style="white-space: pre-wrap;"> an, tatsächlich wurden aber auch </span>`<span class="editor-theme-code">add</span>`<span style="white-space: pre-wrap;"> und </span>`<span class="editor-theme-code">remove</span>`<span style="white-space: pre-wrap;"> erfolgreich vom Parser akzeptiert.</span>

```
swctrl mac block show
swctrl mac block add 00:87:31:73:1e:e0
swctrl mac block show
swctrl mac block remove 00:87:31:73:1e:e0
swctrl mac block show
```

- `<span class="editor-theme-code">show</span>`<span style="white-space: pre-wrap;"> zeigt die aktuell eingetragenen MAC-Adressen und den zuletzt zugeordneten Port.</span>
- `<span class="editor-theme-code">add MAC</span>`<span style="white-space: pre-wrap;"> fügt die angegebene MAC-Adresse zur internen Blockliste hinzu.</span>
- `<span class="editor-theme-code">remove MAC</span>`<span style="white-space: pre-wrap;"> entfernt die MAC-Adresse wieder aus der Blockliste.</span>
- `<span class="editor-theme-code">lastUpdated</span>`<span style="white-space: pre-wrap;"> ist ein interner Zähler beziehungsweise Zeitwert. Die Ausgabe belegt nicht, dass es sich um einen Unix-Zeitstempel oder eine bestimmte Zeiteinheit handelt.</span>

Folgende Varianten sind auf dem getesteten Build nicht gültig:

```
swctrl mac block 00:87:31:73:1e:e0
swctrl mac block del 00:87:31:73:1e:e0
swctrl mac block delete 00:87:31:73:1e:e0
swctrl mac block drop 00:87:31:73:1e:e0
```

<span style="white-space: pre-wrap;">Ein Aufruf wie </span>`<span class="editor-theme-code">swctrl mac block add</span>`<span style="white-space: pre-wrap;"> ohne MAC-Adresse kann ohne verständliche Fehlermeldung zurückkehren. Das darf nicht als Erfolg gewertet werden. Nach jeder Änderung sollte die Blockliste erneut mit </span>`<span class="editor-theme-code">swctrl mac block show</span>`<span style="white-space: pre-wrap;"> geprüft werden.</span>

Der Eintrag in der Blockliste beweist zunächst nur, dass die MAC-Adresse in der laufenden internen Liste steht. Für eine saubere Prüfung der tatsächlichen Sperrwirkung muss der Datenverkehr des betroffenen Clients getestet werden. Ebenso sollte nach einem Reboot und nach einer Controller-Provisionierung geprüft werden, ob der Eintrag erhalten bleibt.

#### `<span class="editor-theme-code">mac white</span>`

`<span class="editor-theme-code">swctrl mac white</span>`<span style="white-space: pre-wrap;"> wird von der Hilfe als weitere MAC-Funktionsgruppe genannt. Im vorliegenden Test wurde sie jedoch nicht weiter aufgerufen. Deshalb lässt sich aus den vorhandenen Daten weder die genaue Syntax noch sicher ableiten, ob sie als Whitelist, Ausnahme zur Blockliste oder für einen anderen internen Zweck verwendet wird.</span>

Für eine belastbare Dokumentation sollte zuerst nur die Hilfe abgefragt werden:

```
swctrl mac white
```

### Sicherheit und Persistenz

Eine MAC-Sperre ist keine starke Zugangskontrolle. MAC-Adressen können nachgeahmt werden. Für dauerhafte Sicherheitsregeln sind controllerverwaltete Switch-ACLs, Port-Isolation oder 802.1X geeigneter als eine manuell gesetzte Laufzeitliste.

<span style="white-space: pre-wrap;">Direkte Änderungen über </span>`<span class="editor-theme-code">swctrl</span>`<span style="white-space: pre-wrap;"> sollten grundsätzlich als firmwareabhängige Laufzeitoperationen behandelt werden. Sie können nach Reboot, Firmware-Update oder erneuter Provisionierung verschwinden oder überschrieben werden.</span>

### Kurzfassung

```
swctrl -h

# Live-Diagnose
swctrl env show
swctrl port show
swctrl port show counters
swctrl sfp show
swctrl mac show
swctrl mac show id 52

# Laufende MAC-Blockliste
swctrl mac block show
swctrl mac block add 00:87:31:73:1e:e0
swctrl mac block remove 00:87:31:73:1e:e0
```

<span style="white-space: pre-wrap;">Damit ist </span>`<span class="editor-theme-code">swctrl</span>`<span style="white-space: pre-wrap;"> vor allem ein Werkzeug für hardwarenahe Live-Diagnose. Einige Funktionsgruppen verändern auch den laufenden Zustand, sind aber nicht mit einer dauerhaft vom UniFi-Controller verwalteten Konfiguration gleichzusetzen.</span>