532 lines
9.3 KiB
Markdown
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 |