# 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 ``` ### Moderne Alternative Wenn möglich: ```bash find . -exec {} + ``` 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.` → 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 ``` #### 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