# Linux Tutorials

Kleine Wissenssammlung zu sonstigen Linux tutorials

# Nützliche Commands

Hier eine Zusammenfassung von einigen basic Commands.
Auf den Servern ist auch das Paket 'tldr' installiert, welches schnell und einfach im Terminal Infos zu einigen Commands liefert: 
```
tldr [command]
```
## Move, verschieben, mv

```
sudo mv <filename> <path_of_destination_directory>
```

## Umbenennen mit mv

```
sudo mv [current file name] [new file name]
```

## Copy, kopieren, cp

```
sudo cp <file> <copy>
```

bei \<copy> den Namen der Kopie eintragen.

-R für rekursiv, also für Unterverzeichnisse

## Remove, löschen, rm

```
sudo rm <name>
```

-r wenn ein Ordner gelöscht werden soll

## Change ownership, besitz eines Ordners ändern, chown

Ownership in einem Ordner anzeigen:

```
ls -l
```

Ownership eines Ordners \<filde> ändern:

```
sudo chown USER:Group <file>
```

## Make directory, Ordner erstellen, mkdir

```
sudo mkdir <name>
```

## SSH Keys

Key generieren:

```
ssh-keygen -t ed25519
```

**Achtung:** der generierte Key muss möglicherweise noch nach <code>/home/\<user>/.ssh</code> verschoben werden.

Key zu Server kopieren:

```
ssh-copy-id user@adresse.de
```

## Größe der Directories anzeigen

```
cd /
sudo du -hs * | sort -rh | head -5
```

## Datenträger Speicher anzeigen

```
df -h
```

## Variables $
Beispiel: Variable zu einem Pfad erstellen:

```
export VARIABLE=/path/to/directory
```

## Scan to pdf und anderer Pdf Schabernack
  - [jpegoptim jpg Komprimieren](https://www.geeksforgeeks.org/optimize-and-compress-jpeg-or-png-images-in-linux-command-line/)
  - [Jpg to pdf](https://askubuntu.com/questions/246647/convert-a-directory-of-jpeg-files-to-a-single-pdf-document)
  - [mehr pdftk shit](https://wiki.ubuntuusers.de/pdftk/)

# Arch

Tutorials speziell zu Arch

# Arch installieren (Youtube Verlinkung)

- [Youtube Dual-Boot](https://www.youtube.com/watch?v=RoTe4uAqIHA)
- [Stromsparen Laptop](https://thinkwiki.de/TLP_-_Linux_Stromsparen)
- [Dual Boot Systemd](https://dev.to/thaqifazfar/dual-boot-windows-and-popos-by-using-systemd-boot-3kfe)
- [Arch Wiki](https://wiki.archlinux.org/title/General_recommendations)

# Docker Networking in Arch

Wenn unter Arch systemd-network verwendet wird, muss eine config Datei unter /etc/systemd/network hinzugefügt werden, damit die Container Zugriff auf das Internet haben.

```console
cd /etc/systemd/network
sudo nano 20-docker.network
```

Nun muss folgendes in diese Datei eingefügt werden:

```console
[Match]
Name=veth*

[Link]
Unmanaged=yes
```

# LTS Kernel als Boot option bei Systemd-boot hinzufügen

Mehr infos zu Systemd-Boot im [Arch Wiki](https://wiki.archlinux.org/title/Systemd-boot)

Als command:

```
bootctl [update]
```

benutzen, mehr dazu im [Arch Wiki](https://man.archlinux.org/man/bootctl.1)

## LTS Kernel Paket installien

Zuerst muss das LTS-Kernel installiert werden:

```
pacman -S linux-lts
```

## Loader entry anlgegen
Als nächstes einen Entry für den Bootloader anlegen im folgen verzeichnis:

```
cd /boot/loader/entries
```

Dort sollte sich mindestens eine <code>.conf</code> Datei befinden.
Am besten die bestehende **Config** der Linux installation kopieren (*Namen ggf anpassen*):

```
cp linux.conf linux-lts.conf
```

In der **linux-lts.conf** anschließend ein paar Zeilen anpassen:

```
title Arch Linux-LTS (linux)
linux /vmlinuz-linux-lts
initrd /amd-ucode.img
initrd /initramfs-linux-lts.img
options root=PARTUUID=[hier-UUID-der-Partition-Eintragen] zswap.enabled=0 rw intel_pstate=no_hwp rootfstype=ext4
```

Hier **Zeile 2** und **3** anpassen und <code>-lts</code> einfügen.

**Wichtig** am Ende nicht vergessen den Bootloader zu aktualisieren:

```
bootctl update
```

# Serial Port (tty) user group

Um auf die Serial Ports unter Arch zugreifen zu können muss der user teil der uucp group sein.

Mit folgendem command kann der User hinzugefügt werden:

```
sudo usermod -aG uucp $USER
```

Danach einmal den PC neustarten, damit die Änderungen angenommen werden.

# Server

Tutorials für Linux Server

# Neuer User

Neuer User durch
```code
sudo useradd -m <Benutzername>
```

mit Passwort:
```
sudo passwd <Benutzername>
```

Im User update und Shell
```
sudo apt install git build-essential
chsh -s /bin/bash
```
(danach **reconnect**)

Optional zu sudo und docker hinzufügen:
```
adduser <Benutzername> sudo
adduser <Benutzername> docker
```

# SSH sicher nutzen

Zum einen sollte ein SSH-key genutzt werden.
Anleitung dazu [hier](https://oldwiki.002.wbnext.de/doku.php?id=tut:lnxcmd#ssh_keys)
##### Key zu server kopieren:
```
ssh-copy-id user@adresse.de
```

## SSH_D Config
Zusätzlich sollten folgende Werte auf dem Server in **/etc/ssh/sshd_config** auf **no** gesetzt werden:
- PermitRootLogin
- PasswordAuthentication
- ChallengeResponseAuthentication

Anschließend sshd **neustarten**:
```
sudo service ssh restart
```


Um ein neues Gerät hinzuzufügen kann wie oben beschrieben der Wert von **PasswordAuthentication** auf **yes** gesetzt werden.\
**NICHT VERGESSEN** wieder auf **no** zu setzten und zwischendurch den shhd service neustarten!

# UFW-Firewall

Mehr Infos [hier](https://www.configserverfirewall.com/ufw-ubuntu-firewall/). \
Einen neuen Port freigeben:
```
sudo ufw allow <PORT>
```

Einen neuen Port [limitiert](https://serverfault.com/questions/368523/rate-limiting-with-ufw-setting-limits) freigeben:
```
sudo ufw limit <PORT>
```

Alle Regeln anzeigen lassen:
```
sudo ufw status
```

Die Firewall starten / stoppen:
```
sudo ufw enable
```
```
sudo ufw disable
```
Regel entfernen:
```
ufw status numbered
ufw delete <number>
```

# WebDAV einbinden

Inspiriert von dieser Website: [wiki.ubuntuusers.de/WebDAV/](https://wiki.ubuntuusers.de/WebDAV/) unter der Sektion Verbindung per davfs2

## Zu installierende Paket

  - ca-certificates
  - davfs2 (universe)

## Vorgehen

In der Datei /etc/fstab muss folgende Zeile hinzugefügt werden:

```
http://<webdavurl> <mountpunkt> davfs defaults,_netdev 0 0
```

Um nun ein Auto-Login einzubinden muss in folgender Datei /etc/davfs2/secrets Folgende Zeile eingebunden werden:

```
<Mountpunkt / WebDAV-URL> <login> "<passwort>"
```

Eventuell müssen noch die Berechtigungen angepasst werden mit:

```
chmod 600 /etc/davfs2/secrets
```

Nun kann es eingehängt werden mit:

```
mount <mountpunkt>
```

Gegebenfalls muss das Mountverzeichnis vorher noch erstellt werden.

# Docker und Docker Netzwerke ipv6 ready machen

- Docker ipv6 enabeln [Tutorial](https://docs.docker.com/config/daemon/ipv6/)
- Falls netzwerk schon vorhanden dieses löschen. Es muss neu erstellt werden.
- [Tutorial](https://medium.com/@skleeschulte/how-to-enable-ipv6-for-docker-containers-on-ubuntu-18-04-c68394a219a2) öffen
- Sektion **Configuring IPv6 NAT** ausführen für <code>-s</code> selbe einstellung wie bei <code>fixed-cidr-v6</code> beim enablen benutzen und selben command nochmal mit subnet für ein eigens Netzwerk zb.: <code>fc00::/80</code>
- folgenden Command für das neue netzwerk mit dem vergeben subnet ausführen:

```
docker network create --ipv6 --subnet=fc00::/80 name_meines_netzwerks
```
- die iptables speicher [Tutorial](https://askubuntu.com/questions/1252275/ubuntu-20-04-cant-persist-the-iptables-configuration) dazu muss man sudo apt-get install iptables-persistent ausführen

# Skript wiederholt als Service ausführen

Als Tutorial wird hier eine Anleitung beschrieben anhand des Falls für die Synchronisation eines Ordners mit der Nextcloud.
Für die Synchronisation mit der Nextcloud soll der Command <code>nextcloudcmd</code> periodisch ausgeführt werden.
Anleitung Orientiert sich am Fall mit [restic](https://blog.bithive.space/post/automatic-backups-with-restic/).

## Skript erstellen
Im Verzeichnis <code>/etc/nextcloud</code> wird das folgende Skript <code>auto_sync.sh</code> erstellt (USER und PASSWORT entsprechend anpassen):

```bash
#!/bin/bash
nextcloudcmd /opt/nextcloud/ https://<USER>:<PASSWORT>@nx22569.your-storageshare.de/
```

Das Skript wird ausführbar gemacht:

```
chmod +x auto_sync.sh
```

## Timer erstellen

<code>/etc/systemd/system/nextcloud-sync.timer</code> erstellen:

```
[Unit]
Description=Nextcloud Sync every 30 seconds

[Timer]
OnCalendar=*-*-* *:*:00,30
Persistent=true

[Install]
WantedBy=timers.target
```

<code>/etc/systemd/system/nextcloud-sync.service</code> erstellen:

```
[Unit]
Description=Nextcloud Sync with nextcloudcmd
[Service]
Type=simple
Nice=10
ExecStart=/etc/nextcloud/auto_sync.sh
```

## Timer starten
Timer muss einmalig gestartet werden mit 

```
systemctl enable nextcloud-sync.timer --now
```

# Nextcloud mounten mit WebDAV

Ausführlich ist das mounten der Nextcloud in der [offiziellen Dokumentation](https://docs.nextcloud.com/server/20/user_manual/en/files/access_webdav.html) beschieben.

### Anmerkung zur Anleitung aus der offiziellen Dokumentation
- In **Abschnitt 3** kann der <code>nextcloud</code> Ordner in einem beliebigen Verzeichnis erstellt werdne. Sinnvoll ist möglichweise auch das <code>/mnt</code> Verzeichnis.
- In **Abschnitt 7** kann <code>auto</code> durch <code>noauto</code> ersetzt werden, wenn das mounten nicht bei jedem Neustart geschehen muss.
- Wie im Abschnitt **Known Issues** beschrieben **muss** <code>use_locks 0</code> gesetzt werden

# Dolibarr CheatSheet

[![DolibarrUserCheatSheet-EN-v1.jpg](https://wiki.wbnext.de/uploads/images/gallery/2023-10/scaled-1680-/VUa6K1Ro4UdUJRUd-dolibarrusercheatsheet-en-v1.jpg)](https://wiki.wbnext.de/uploads/images/gallery/2023-10/VUa6K1Ro4UdUJRUd-dolibarrusercheatsheet-en-v1.jpg)

# Allgemein

Allgemein gültige Tutorials

# Yubikey Nutzung

- [Mit Yubikey unter Arch Linux einloggen (Challenge-Response, offline)](https://legacy.thomas-leister.de/mit-yubikey-unter-arch-linux-einloggen-offline/)

## Yubikey GPG

Zu PGP siehe [E-Mail Verschlüsselung mit OpenPGP](https://wiki.wbnext.de/books/linux-tutorials/page/e-mail-verschlusselung-mit-openpgp)
  - [importing Keys](https://developers.yubico.com/PGP/Importing_keys.html)
  - [PGP Walk-Through](https://developers.yubico.com/PGP/PGP_Walk-Through.html)
  - [ausführliches doc hier](https://github.com/drduh/YubiKey-Guide)

## E-Mail 2 Yubikeys
Having created two (or more Yubikeys) with the same GPG key (as described above) where the stubs are pointing to the second Yubikey.

Insert the first Yubikey (which has a different serial number) and run the following command:
```
$   gpg-connect-agent "scd serialno" "learn --force" /bye
```

GPG will then scan your first Yubikey for GPG keys and recreate the stubs to point to the GPG keyID and Yubikey Serial number of this first Yubikey.
To return to using the second Yubikey just repeat (insert other Yubikey and re-run command).

# E-Mail Verschlüsselung mit OpenPGP

Tiefere Infos unter [gnupg.org](https://gnupg.org/). GnuPG (GPG) implementiert den OpenPGP Standard.
  - [Cheat Sheet Commands](https://rtcamp.com/tutorials/linux/gpg-keys/)
  - [one key 2 e-mails](https://superuser.com/questions/293184/one-gnupg-pgp-key-pair-two-emails)
  - [keys mit Smartcard (yubikey)](https://wiki.mozilla.org/Thunderbird:OpenPGP:Smartcards)
  - [Key setup](https://github.com/drduh/YubiKey-Guide#notes)

## Clients

Um verschlüsselte E-Mails versenden zu können benötigt man einen Client zum verwalten der **Schlüssel**, sowie einen E-Mail Client, welcher fähig ist verschlüsselte Mails zu senden und zu empfangen.
Eine **Liste an E-Mail Clients** kann [hier](https://www.openpgp.org/software/) gefunden werden.
Für Desktop empfehle ich Thunderbird, für Android FairMail, sowie OpenKeychain zum verwalten der Schlüssel.

## Schlüssel erstellen

Ein Schlüssel Paar bestehen aus Privatem und Öffentlichem Key kann einfach in Thunderbird erstellt werden:
**Extras --> OpenPGP-Schlüssel verwalten --> Erzeugen --> Neues Schlüsselpaar**
Anschließend die E-mail auswählen und mit den Standardeinstellungen erzeugen.

## Schlüssel verteilen

**Wichtig** niemals den privaten Schlüssel weitergeben!!

### Privaten Schlüssel

Der Private Schlüssel kann in Thunderbird mit der Option **Datei --> Sicherheitskopie für geheimen Schlüssel erstellen** als Datei gespeichert werden.
Diese Datei sollte dann über einen Sicheren Weg (z.B unsere Nextcloud) auf die anderen Clients(z.B. dein Handy), von denen du verschlüsselte Mails senden möchtest verteilt werden.

### Öffentlicher Schlüssel

Um deinem E-Mail Empfänger deinen Öffentlichen Schlüssel zugänglich zu machen, sollte dieser auf einem Key-Server hochgeladen werden. [key.openpgp.org](https://keys.openpgp.org/) wird als Standard von den meisten Clients verwendet. Der Öffentliche Schlüssel kann über das [Webinterface](https://keys.openpgp.org/upload) hochgeladen werden.

### Schlüssel eines Anderen suchen

Über Thunderbird sowie allen anderen Clients kann über eine Option wie z.B in Thunderbird **OpenPGP-Schlüssel verwalten --> Schlüsselserver --> Schlüssel online finden** der Öffentliche Schlüssel andere Leute importiert werden.

## Verschlüsselte E-mails senden/empfangen/unterschreiben

**Wichtig** in Thunderbird muss möglicherweise unter den Konteneinstellungen den jeweiligen Identitäten unter **"Ende-zu-Ende-Verschlüsselung"** der richtige Schlüssel zugeordnet werden.

### Senden

Zum Senden kann in den Mailclients mit einer Funktion, wie z.B. in Thunderbird **OpenPGP --> Verschlüsseln** beim verfassen der Mail diese verschlüsselt werden.  Anschließend einfach Senden.
**Wichtig** zum Senden einer verschlüsselten Mail wird der Öffentliche Schlüssel des Empfängers benötigt!

### Empfangen

Beim Empfangen sollten die verschlüsselten Mails automatisch entschlüsselt werden.

### Unterschreiben

E-mails können mit einem OpenPGP Schlüssel unterschrieben werden, sodass der Empfänger sicherstellen kann, dass diese nicht verändert wurde (Man-in-the-Middle). 
Um eine empfangene unterschriebene Mail als authentisch zu erkennen, wird der Öffentliche Schlüssel des Senders benötigt.

# Archiv komprimieren mit Tar und Gzip

Archiv komprimieren mit Tar und Gzip

Archiv **extrahieren**:

```
sudo tar -xvzf documents.tar.gz
```

oder mit **Zielordner**:

```
sudo tar -xvzf documents.tar.gz -C /opt/containers
```

now Variable erstellen:

```
now=`date +"%Y-%m-%d"`
```

Inhalt eines Ordner **komprimieren**:  

```
cd /opt
sudo tar -cvzf containers_${now}.tar.gz containers
```

# Daten Größen auflisten

Mit dem commandline tool <code>ncdu</code> kann aufgelistet werden wo welche daten und wie groß gespeichert sind

```
sudo pacman -S ncdu
```

# Latex und VS-Code

Hier gibts das Tutorial für Latex und VS-Code: [mathjiajia.github.io](https://mathjiajia.github.io/vscode-and-latex/)

# Battery Status Laptop

Mit folgendem Command können sie alle möglichen Informationen über ihere Laptopbattery bekommen:
```
sudo tlp-stat -b 
```

# ZSH mit Theme

* Empfehlenswert alle zsh sachen mit [oh-my-zsh](https://github.com/ohmyzsh/ohmyzsh) zu machen
  * change to zsh shell: <code>chsh -s /bin/zsh username</code>
  * zsh-syntax-highlighting
  * zsh-autosuggestions
  * zsh-history-substring-search
  * [Powerlevel 10K Theme](https://github.com/romkatv/powerlevel10k#arch-linux)
  * Da Powerlevel 10K nicht mehr maintend wird gibt es [Starship](https://starship.rs/) als alternative. Ich kann empfehlen seine shell initial mit einem [Preset](https://starship.rs/presets/) zu stylen

Link zu meiner (Michi) .zshrc Konfig [hier](https://nx22569.your-storageshare.de/s/Cs6tGXHK5zL72Ns)

# Windows Virtualization with Gnome-Boxes

For easy virtualisation i recommend gnome-boxes. Any Linuxdistro is easy to virtualize Windows is a little harder. There are two guides Win 10 i tryed and it worked. The Win 11 guide i haven't tried yet:
- [Windows 10](https://www.ctrl.blog/entry/how-to-win10-in-gnome-boxes.html)
- [Windows 11](https://www.ctrl.blog/entry/how-to-win11-in-gnome-boxes.html)