Files
Snippets/Linux-Sammelsurium.md
T

532 lines
9.3 KiB
Markdown

# Linux: Projekte ablegen, Dateien suchen/löschen und `xargs`
## Projekte unter Linux organisieren
Es gibt keine feste Vorgabe, aber einige Verzeichnisstrukturen haben sich etabliert.
### Für persönliche Entwicklungsprojekte
Empfohlen:
- `~/Projects/`
- `~/Code/`
- `~/src/` (unter Entwicklern sehr verbreitet)
Beispiel:
```text
/home/max/
├── Documents/
├── Downloads/
├── Projects/
│ ├── website/
│ ├── python-tool/
│ └── homelab/
```
Oder eine nach Git-Hosting strukturierte Variante:
```text
~/src/
├── github.com/
│ └── benutzer/
│ ├── projekt1/
│ └── projekt2/
└── private/
```
Verzeichnis anlegen:
```bash
mkdir -p ~/Projects
```
oder
```bash
mkdir -p ~/src
```
### Für mehrere Benutzer
| Verzeichnis | Zweck |
| ----------------- | ----------------------------------------------------------------- |
| `/srv/` | Gemeinsam genutzte Projekte oder Dienste |
| `/usr/local/src/` | Systemweiter Quellcode |
| `/opt/` | Installierte Drittanbieter-Software (nicht für eigenen Quellcode) |
---
# Dateien mit `find` suchen und löschen
## Dateien nach Namen löschen
Alle `.tmp`-Dateien löschen:
```bash
find . -name "*.tmp" -delete
```
---
## Erst suchen, dann löschen (empfohlen)
Dateien anzeigen:
```bash
find . -name "*.tmp"
```
Anschließend löschen:
```bash
find . -name "*.tmp" -delete
```
---
## Mit Rückfrage löschen
```bash
find . -name "*.tmp" -ok rm {} \;
```
oder
```bash
find . -name "*.tmp" -exec rm -i {} \;
```
---
## Nach Alter löschen
Logdateien, die älter als 30 Tage sind:
```bash
find . -name "*.log" -mtime +30 -delete
```
---
## Leere Verzeichnisse löschen
```bash
find . -type d -empty -delete
```
---
## Achtung
`-delete` löscht Dateien sofort und ohne Papierkorb.
Deshalb empfiehlt sich immer:
1. `find` ohne `-delete`
2. Ergebnisse prüfen
3. `-delete` ergänzen
Beispiel:
```bash
find ~/Downloads -name "*.zip"
find ~/Downloads -name "*.zip" -delete
```
---
# xargs erklärt
## Was macht `xargs`?
`xargs` nimmt Eingaben (meist aus einer Pipe) entgegen und macht daraus Argumente für einen anderen Befehl.
Beispiel:
```bash
echo "a.txt b.txt c.txt" | xargs rm
```
Das entspricht:
```bash
rm a.txt b.txt c.txt
```
---
## Typischer Einsatz mit `find`
Ohne `xargs`:
```bash
find . -name "*.log" -exec rm {} \;
```
Mit `xargs`:
```bash
find . -name "*.log" | xargs rm
```
`xargs` bündelt mehrere Dateinamen zu einem einzigen `rm`-Aufruf und ist dadurch oft effizienter.
---
## Problem mit Leerzeichen
Angenommen, es gibt eine Datei:
```text
Meine Datei.txt
```
Dann liefert:
```bash
find . -name "*.txt" | xargs rm
```
`xargs` trennt standardmäßig an Leerzeichen und Zeilenumbrüchen.
Es interpretiert:
```text
./Meine Datei.txt
```
als zwei Argumente:
- `./Meine`
- `Datei.txt`
Das führt zu Fehlern.
---
## Die sichere Lösung
Deshalb verwendet man fast immer:
```bash
find . -name "*.txt" -print0 | xargs -0 rm
```
### Warum?
- `find -print0` trennt Dateinamen mit einem Nullbyte (`\0`)
- `xargs -0` liest genau dieses Format
Dadurch funktionieren auch Dateinamen mit:
- Leerzeichen
- Tabs
- Zeilenumbrüchen
- Sonderzeichen
---
## Platzhalter mit `-I`
Soll der Dateiname mitten im Befehl stehen:
```bash
find . -name "*.jpg" | xargs -I {} cp {} /backup/
```
Für jede Datei wird ausgeführt:
```bash
cp datei.jpg /backup/
```
---
## Anzahl der Argumente begrenzen
```bash
seq 1 10 | xargs -n 3 echo
```
Ausgabe:
```text
1 2 3
4 5 6
7 8 9
10
```
`-n 3` bedeutet: maximal drei Argumente pro Befehlsaufruf.
---
## Parallelisierung
Mehrere Prozesse gleichzeitig starten:
```bash
find . -name "*.png" | xargs -P 4 -n 1 convert
```
Parameter:
- `-P 4` → bis zu vier Prozesse parallel
- `-n 1` → ein Dateiname pro Prozess
---
## Alternative ohne `xargs`
Viele moderne Befehle unterstützen bereits mehrere Dateien gleichzeitig.
Beispiel:
```bash
find . -name "*.log" -exec rm {} +
```
Das erreicht nahezu denselben Effekt wie:
```bash
find . -name "*.log" -print0 | xargs -0 rm
```
---
# Merksätze
### Projekte
- Eigene Projekte → `~/Projects` oder `~/src`
- Gemeinsame Projekte → `/srv`
- Installierte Software → `/opt`
### `find`
- Dateien suchen:
```bash
find . -name "*.txt"
```
- Direkt löschen:
```bash
find . -name "*.txt" -delete
```
### `xargs`
- Macht aus Pipe-Ausgabe Befehlsargumente.
- Spart viele einzelne Programmaufrufe.
- Immer sicher verwenden mit:
```bash
find . -print0 | xargs -0 <befehl>
```
### Moderne Alternative
Wenn möglich:
```bash
find . -exec <befehl> {} +
```
Diese Variante ist oft einfacher und ebenso effizient.
# SNMP: MIB-Auflösung und OID-Übersetzung mit net-snmp
## OIDs werden trotz eingehängter MIB nicht textuell aufgelöst
### Mögliche Ursachen
**MIB wird nicht geladen**
- MIB liegt nicht in einem durchsuchten Verzeichnis. Prüfen mit `net-snmp-config --default-mibdirs`; übliche Pfade sind `~/.snmp/mibs`, `/usr/share/snmp/mibs`.
- MIB nicht per `-m` oder Konfiguration aktiviert. Test: `snmpwalk -m ALL ...` oder in `~/.snmp/snmp.conf` bzw. `/etc/snmp/snmp.conf`: `mibs +MEIN-MIB`.
- net-snmp lädt standardmäßig nur ein Minimalset. `mibs :` deaktiviert alles.
**Dateiname passt nicht zum MIB-Namen**
- net-snmp löst Module über den Dateinamen auf; der interne Modulname (vor `DEFINITIONS ::= BEGIN`) muss stimmen.
**Fehlende IMPORTS / Abhängigkeiten**
- Importierte MIBs (z. B. `SNMPv2-SMI`, `SNMPv2-TC`, herstellereigene Basis-MIBs) fehlen → Parsen schlägt still fehl. Sichtbar machen mit:
```bash
snmptranslate -M+/pfad -m ALL -Dparse-mibs OID
```
**Parse-/Syntaxfehler in der MIB**
- Diagnose:
```bash
snmptranslate -Le -m ALL -M /pfad -On MEIN-MIB::objekt
```
Fehler werden auf stderr ausgegeben.
**Numerische OID gehört zu keinem geladenen Zweig**
- Die abgefragte Enterprise-OID liegt außerhalb dessen, was die MIB definiert (falsche/unvollständige MIB).
### Schneller Prüfweg
1. `snmptranslate -m +MEIN-MIB -IR meinObjekt` → gibt es einen Treffer?
2. `snmptranslate -Le -M /pfad/zu/mibs -m ALL .1.3.6.1.4.1.<enterprise>` → Fehler beim Laden?
3. Fehlende Import-MIBs nachlegen.
Meist ist es eine fehlende Import-Abhängigkeit oder ein falscher Suchpfad/Modulname.
---
## Umgekehrt: von `MIB::objekt` auf die OID schließen
Textuellen Namen statt numerischer OID übergeben (MIB muss geladen sein):
```bash
snmpget -v2c -c public host MEIN-MIB::meinObjekt.0
snmpwalk -v2c -c public host MEIN-MIB::meinObjekt
```
### Vorher ohne Gerät prüfen (Name → OID)
```bash
snmptranslate -On MEIN-MIB::meinObjekt
```
`-On` erzwingt die numerische Ausgabe, also die zugehörige OID.
Umgekehrt (OID → Name):
```
snmptranslate .1.3.6.1.4.1.xxx
```
### Nützliche Varianten
- Objektname allein suchen (ohne `MIB::`-Präfix):
```
snmptranslate -IR -On meinObjekt
```
- Vollständigen symbolischen Pfad anzeigen:
```
snmptranslate -Of MEIN-MIB::meinObjekt
```
- Objektdetails (Typ, Zugriff, Beschreibung):
```
snmptranslate -Td MEIN-MIB::meinObjekt
```
### Hinweise
- Scheitert `snmpget MEIN-MIB::meinObjekt.0` mit „Unknown Object Identifier", ist die MIB nicht geladen → mit `-m +MEIN-MIB` bzw. `-M /pfad` ergänzen.
- Bei skalaren Objekten die `.0`-Instanz nicht vergessen.
# Idoit von 35 auf 38
Test auf Masternode
- kein main-Mode
- ohne ansible
## php8.2 zu 8.4
8.2-Module ermitteln, die Ausgabe listet die entsprechenden 8.4-Paketnamen
```bash
dpkg -l | grep '^ii php8.2' | awk '{print $2}' | sed 's/8.2/8.4/'
```
Update der entsprechenden Pakete
```bash
apt update
apt install -y $(dpkg -l | grep '^ii php8.2' | awk '{print $2}' | sed 's/8.2/8.4/')
```
Umschalten (mod_php/Apache) und CLI
```bash
a2dismod php8.2 && a2enmod php8.4
crm res restart rcapache2
update-alternatives --set php /usr/bin/php8.4
```
# Zertifikate
## Ein CSR (Certificate Signing Request) erstellen (bei vorhandenem )
```bash
openssl req -new -key server.key -out server.csr
```
Hier werden dann einige Daten abgefragt. Daher ist es einfacher mit einem Config-File das man mit übergibt
```bash
openssl req -new -key server.key -out server.csr -config config.req
```
### Muster für ein Config-File
```bash
[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
req_extensions = req_cert_ext
prompt = no
default_days = 365
[ req_distinguished_name ]
#
# requested SubjectDN
#
C = DE
O = Bund
OU = Service
CN = cmdb01.adm.ivbb.bund.de
emailAddress = mail@bund.de
[req_cert_ext]
#
subjectAltName = @alt_names
## requested SubjectAlternativeNames (SANs)
[ alt_names ]
DNS.1 = cmdb01.adm.ivbb.bund.de
DNS.2 = mlseazcmd01.adm.ivbb.bund.de
DNS.3 = mlsfazcmd01.adm.ivbb.bund.de
```
## Betrachten des CSR
```bash
openssl req -text -in <csr>
```
#### Notizen zu Zertifikate
##### Private Key erstellen
openssl genrsa -out $HOME/servercrt/dlsea3tim01.server.key 2048
##### Zertifikatsrequest erstellen
openssl req -new -days 1095 -key dlsea3tim01.server.key -out dlsea3tim01.server.csr -config req_config.dlsea3tim01.adm.ivbb.bund.de
##### Zertifikatsrequest ansehen
openssl req -text -in dlsea3tim01.server.csr|less