mirror of
https://codeberg.org/Mo8it/How_To_Linux.git
synced 2024-12-05 01:40:32 +00:00
Compare commits
2 commits
70d0129f5b
...
e009156b6c
Author | SHA1 | Date | |
---|---|---|---|
e009156b6c | |||
89e2a5745c |
4 changed files with 503 additions and 1 deletions
|
@ -11,5 +11,7 @@
|
|||
- [Shell glue](day_2/glue.md)
|
||||
- [Tasks](day_2/tasks.md)
|
||||
- [Day 3](day_3/README.md)
|
||||
- [Notes](day_3/notes.md)
|
||||
- [Tasks](day_3/tasks.md)
|
||||
- [Day 4](day_4/README.md)
|
||||
- [Day 5](day_5/README.md)
|
||||
|
|
|
@ -30,7 +30,13 @@ We will use the program `inotifywait`. This program can monitor a directory and
|
|||
1. Based on the output, choose an event that you want to listen to with `inotifywait` that tells you when a file is _completely_ added to the directory `jobs`. Use the manual to read more about specific events.
|
||||
1. Find an option that lets you tell `inotifywait` to only notify when the choosen event occurs.
|
||||
1. Find an option that lets you format the output of the notification of `inotifywait`. Since we only listen on one event and monitor only one directory, an output that shows only the name of the new file should be enough.
|
||||
1. Enter the command that you have until now in a script. Now extend it by using a `while` loop that continously listens on the notifications of `inotifywait`.
|
||||
1. Enter the command that you have until now in a script. Now extend it by using a `while` loop that continously listens on the notifications of `inotifywait`. Use the following snippet while replacing the sections with `(...)`:
|
||||
```bash
|
||||
inotifywait (...) | while read FILENAME
|
||||
do
|
||||
(...)
|
||||
done
|
||||
```
|
||||
1. After a notification, the body of the `while` loop should first print the name of the script that was added. From now on, we only want to add scripts to the `jobs` directory.
|
||||
1. After printing the script name, run the script!
|
||||
1. Save the standard output and standard error of the script into two separate files in the `logs` directory. If the name of the script is `job.sh` for example, then the output should be in the files `logs/job.sh.out` and `logs/job.sh.err`.
|
||||
|
@ -56,6 +62,33 @@ If the name of the job script is `job.sh` for example, the job script should be
|
|||
|
||||
Use variables to write the script to make it more understandable.
|
||||
|
||||
#### Help
|
||||
|
||||
To save the output of a command into a variable, use you have to use the following syntax:
|
||||
|
||||
```bash
|
||||
DATE=$(date ...)
|
||||
```
|
||||
|
||||
Replace `...` with your code.
|
||||
|
||||
To read the `n`-th argument that is provided to a script you write, you have to use `$n`.
|
||||
|
||||
Example script called `arg.sh`:
|
||||
|
||||
```bash
|
||||
#!/usr/bin/bash
|
||||
|
||||
echo "The first argument is: $1"
|
||||
```
|
||||
|
||||
When you run this script with an argument:
|
||||
|
||||
```console
|
||||
$ ./arg.sh "Hello"
|
||||
The first argument is: Hello
|
||||
```
|
||||
|
||||
## Task: Submit a job
|
||||
|
||||
Write a small scripts of your choice that require a long time to run and submit them using the script from the last task. Make sure that the scheduler is running in the background.
|
||||
|
|
336
src/day_3/notes.md
Normal file
336
src/day_3/notes.md
Normal file
|
@ -0,0 +1,336 @@
|
|||
# Notes
|
||||
|
||||
## Shell tricks
|
||||
|
||||
### Expansion
|
||||
|
||||
```bash
|
||||
# mkdir -p dir/sub1 dir/sub2
|
||||
mkdir -p dir/sub{1,2}
|
||||
|
||||
# touch dir/sub1/file1.txt dir/sub1/file2.txt
|
||||
touch dir/sub1/file{1,2}.txt
|
||||
|
||||
# cp dir/sub1/file1.txt dir/sub1/file1.txt
|
||||
cp dir/sub1/file1.txt{,.bak}
|
||||
```
|
||||
|
||||
### Globbing
|
||||
|
||||
```bash
|
||||
# Print content of all files ending with `.sh`
|
||||
cat *.sh
|
||||
|
||||
# Move all files visible files and directories from dir1 to dir2
|
||||
mv dir1/* dir2
|
||||
|
||||
# Move all hidden files and directories from dir1 to dir2
|
||||
mv dir1/.* dir2
|
||||
|
||||
# Move all visible and hidden files and directories from dir1 to dir2
|
||||
# mv dir1/* dir1/.* dir2
|
||||
mv dir1/{,.}* dir2
|
||||
```
|
||||
|
||||
## Cargo
|
||||
|
||||
```bash
|
||||
# Install. openssl-devel needed for cargo-update
|
||||
sudo dnf install cargo openssl-devel
|
||||
|
||||
# To be able to run cargo install-update -a
|
||||
cargo install cargo-update
|
||||
|
||||
# Install crate (package)
|
||||
cargo install CRATENAME
|
||||
|
||||
# Update installed crates
|
||||
cargo install-update -a
|
||||
```
|
||||
|
||||
## bashrc
|
||||
|
||||
You write at the end of `~/.bashrc`.
|
||||
|
||||
### PATH
|
||||
|
||||
Add Cargo binaries to `PATH`:
|
||||
|
||||
```bash
|
||||
export PATH="$PATH:$HOME/.cargo/bin"
|
||||
```
|
||||
|
||||
### Alias
|
||||
|
||||
```bash
|
||||
alias rm="trash"
|
||||
```
|
||||
|
||||
## Fish
|
||||
|
||||
`~/.config/config.fish`
|
||||
|
||||
```bash
|
||||
if status is-interactive
|
||||
# Disable greeting message
|
||||
set -g fish_greeting
|
||||
|
||||
# Abbreviations
|
||||
abbr -ag cp "cp -i"
|
||||
abbr -ag mv "mv -i"
|
||||
abbr -ag rmr "rm -r"
|
||||
abbr -ag rm "trash"
|
||||
abbr -ag rsync "rsync -Lahz"
|
||||
|
||||
# Aliases
|
||||
alias cat "bat"
|
||||
alias lg "lazygit"
|
||||
|
||||
# Functions
|
||||
function demo
|
||||
echo "Hallo from demo function!"
|
||||
echo "Arguments taken: $argv"
|
||||
echo "First argument: $argv[1]"
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
Add to path:
|
||||
|
||||
```bash
|
||||
fish_add_path ~/.cargo/bin
|
||||
fish_add_path ~/.local/bin
|
||||
```
|
||||
|
||||
## SSH
|
||||
|
||||
### Setup host
|
||||
|
||||
In `~/.ssh/config`
|
||||
|
||||
```
|
||||
Host HOST
|
||||
HostName SERVERIP
|
||||
User SERVERUSER
|
||||
```
|
||||
|
||||
### Generate key pair
|
||||
|
||||
```bash
|
||||
ssh-keygen -t ed25519 -C "COMMENT"
|
||||
```
|
||||
|
||||
Leave blank to take default for the prompt `Enter file in which to save the key (/home/USERNAME/.ssh/id_ed25519)`.
|
||||
|
||||
Then enter a passphrase for your key. **You should not leave it blank!**
|
||||
|
||||
### Add public key to server
|
||||
|
||||
```bash
|
||||
ssh-copy-id -i ~/.ssh/id_ed25519.pub HOST
|
||||
```
|
||||
|
||||
### Connect
|
||||
|
||||
```bash
|
||||
ssh HOST
|
||||
```
|
||||
|
||||
### Config on server
|
||||
|
||||
**Very important for security!** Only after adding the public key to the server!
|
||||
|
||||
> WARNING ⚠️ :
|
||||
>
|
||||
> Verify that you are only asked for the passphrase of the SSH key before continueing in this section!
|
||||
>
|
||||
> If you are asked for the password of the user on the server when connecting, then the authentication with a key did not work. Therefore, don't set `PasswordAuthentication no`! Fix the issue with the key authentication first. **Otherwise, you will be locked out of the server!** ⚠️
|
||||
|
||||
In `/etc/ssh/sshd_config` on the server:
|
||||
|
||||
Uncomment line with `PasswordAuthentication` and set it to `PasswordAuthentication no`
|
||||
|
||||
Save and exit, then run:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart sshd
|
||||
```
|
||||
|
||||
If you are locked out after running this command, then you did not take the warning above seriously!
|
||||
|
||||
### Copy files
|
||||
|
||||
From server:
|
||||
|
||||
```bash
|
||||
scp HOST:SRC_PATH DEST_PATH
|
||||
```
|
||||
|
||||
To server:
|
||||
|
||||
```bash
|
||||
scp SRC_PATH HOST:DEST_PATH
|
||||
```
|
||||
|
||||
Options:
|
||||
|
||||
- `-r`, `--recursive`: For directories.
|
||||
|
||||
## Rsync
|
||||
|
||||
From server:
|
||||
|
||||
```bash
|
||||
rsync -Lahz HOST:SRC_PATH DEST_PATH
|
||||
```
|
||||
|
||||
To server:
|
||||
|
||||
```bash
|
||||
rsync -Lahz SRC_PATH HOST:DEST_PATH
|
||||
```
|
||||
|
||||
Options:
|
||||
|
||||
- `-a`, `--archieve`: Set of useful options to preserve permissions, use recursive mode, etc.
|
||||
- `-h`, `--human-readable`: Output number in a human-readable format.
|
||||
- `-z`, `--compress`: Use compression.
|
||||
- `--partial`: Continue after interruption.
|
||||
- `-L`, `--copy-links`: Copy links.
|
||||
- `-v`, `--verbose`: Show more infos.
|
||||
- `--delete`: Delete files from `DEST_PATH` if they don't exist on `SRC_PATH` anymore. **Use with caution!!!**
|
||||
|
||||
## Systemd
|
||||
|
||||
Check status of a service:
|
||||
|
||||
```bash
|
||||
sudo systemctl status SERVICENAME
|
||||
```
|
||||
|
||||
Enable service:
|
||||
|
||||
```bash
|
||||
sudo systemctl enable SERVICENAME
|
||||
```
|
||||
|
||||
Start service:
|
||||
|
||||
```bash
|
||||
sudo systemctl start SERVICENAME
|
||||
```
|
||||
|
||||
Enable and start service at the same time:
|
||||
|
||||
```bash
|
||||
sudo systemctl enable --now SERVICENAME
|
||||
```
|
||||
|
||||
Disable service:
|
||||
|
||||
```bash
|
||||
sudo systemctl disable SERVICENAME
|
||||
```
|
||||
|
||||
Stop service:
|
||||
|
||||
```bash
|
||||
sudo systemctl stop SERVICENAME
|
||||
```
|
||||
|
||||
Disable and stop service at the same time:
|
||||
|
||||
```bash
|
||||
sudo systemctl disable --now SERVICENAME
|
||||
```
|
||||
|
||||
## Firewalld
|
||||
|
||||
Install and enable firewalld:
|
||||
|
||||
```bash
|
||||
sudo dnf install firewalld
|
||||
sudo systemctl enable --now firewalld
|
||||
```
|
||||
|
||||
View open ports and services:
|
||||
|
||||
```bash
|
||||
sudo firewall-cmd --list-all
|
||||
```
|
||||
|
||||
Open ports 80 (http) and 443 (https):
|
||||
|
||||
```bash
|
||||
sudo firewall-cmd --add-service http
|
||||
sudo firewall-cmd --add-service https
|
||||
sudo firewall-cmd --runtime-to-permanent
|
||||
```
|
||||
|
||||
or:
|
||||
|
||||
```bash
|
||||
sudo firewall-cmd --add-port 80/tcp
|
||||
sudo firewall-cmd --add-port 443/tcp
|
||||
sudo firewall-cmd --runtime-to-permanent
|
||||
```
|
||||
|
||||
## Podman
|
||||
|
||||
```bash
|
||||
# Search for image
|
||||
podman search python
|
||||
|
||||
# Pull image
|
||||
podman pull docker.io/library/python:latest
|
||||
|
||||
# See pulled images
|
||||
podman images
|
||||
|
||||
# Run container and remove it afterwards
|
||||
podman run -it --rm docker.io/library/python:latest bash
|
||||
|
||||
# Create network
|
||||
podman network create NETWORKNAME
|
||||
|
||||
# Create container
|
||||
podman create \
|
||||
--name CONTAINERNAME \
|
||||
--network NETWORKNAME \
|
||||
-e ENVVAR="Some value for the demo environment variable" \
|
||||
--tz local \
|
||||
docker.io/library/python:latest
|
||||
|
||||
# Start container
|
||||
podman start CONTAINERNAME
|
||||
|
||||
# Enter a running container
|
||||
podman exec -it CONTAINERNAME bash
|
||||
|
||||
# Stop container
|
||||
podman stop CONTAINERNAME
|
||||
|
||||
# Generate systemd files
|
||||
podman generate systemd --new --files --name CONTAINERNAME
|
||||
|
||||
# Create directory for user's systemd services
|
||||
mkdir -p ~/.config/systemd/user
|
||||
|
||||
# Place service file
|
||||
mv container-CONTAINERNAME.service ~/.config/systemd/user
|
||||
|
||||
# Activate user's service (container)
|
||||
systemctl --user enable --now container-CONTAINERNAME
|
||||
```
|
||||
|
||||
Keep user's systemd services live after logging out:
|
||||
|
||||
```bash
|
||||
sudo loginctl enable-linger USERNAME
|
||||
```
|
||||
|
||||
Options:
|
||||
|
||||
- `-v`, `--volume`: `SRC_PATH:DEST_PATH:L`. Label should be one of `z`, `z,ro`, `Z` or `Z,ro`.
|
||||
- `--label "io.containers.autoupdate=registry"` for `podman auto-update`
|
||||
- `-p`, `--publish`: `SERVER_PORT:CONTAINER_PORT`
|
131
src/day_3/tasks.md
Normal file
131
src/day_3/tasks.md
Normal file
|
@ -0,0 +1,131 @@
|
|||
# Tasks
|
||||
|
||||
Do the tasks in the given order! They depend on each other.
|
||||
|
||||
## Task 1: Cargo
|
||||
|
||||
Use `cargo` to install the following crates:
|
||||
|
||||
- cargo-update
|
||||
- tealdeer
|
||||
|
||||
It might take a long time to compile everything.
|
||||
|
||||
Add `$HOME/.cargo/bin` to your `PATH`.
|
||||
|
||||
`cargo-update` should be installed to be able to run `cargo install-update -a` to update all installed crates. Try running the command. But you should not find any updates since you did just install the crates.
|
||||
|
||||
The crate `tealdeer` provides you with the program `tldr`.
|
||||
|
||||
Run `tldr --update`. Now run the following two commands:
|
||||
|
||||
```bash
|
||||
tldr dnf
|
||||
tldr apt
|
||||
```
|
||||
|
||||
It should be obvious to you what `tldr` does after you run the commands. Try it with other programs than `dnf` and `apt`!
|
||||
|
||||
## Task 2: SSH
|
||||
|
||||
Generate a SSH key pair and send me the public key per email: mo8it@proton.me
|
||||
|
||||
Enter a passphrase while generating the key pair!
|
||||
|
||||
Don't send me the private key!!! **You should never send your private SSH keys to anyone!**
|
||||
|
||||
The public key ends with `.pub`.
|
||||
|
||||
I will then append your public key to `~/.ssh/authorized_keys` on the server that we will use in the next tasks. After I add your public key, you will be able to login to the server and do the next tasks.
|
||||
|
||||
Create the file `~/.ssh/config` and add the server as a host with the name `linux-lab`.
|
||||
|
||||
Enter this IP: 45.94.58.19
|
||||
Enter this user: admin
|
||||
|
||||
After that I add you public key, connect to the server using the host name that you did enter in `~/.ssh/config` which should be `linux-lab`.
|
||||
|
||||
## Task 3: User creation
|
||||
|
||||
1. Create a user for you on the server after connecting with SSH. To do so, run:
|
||||
```bash
|
||||
sudo useradd USERNAME
|
||||
```
|
||||
|
||||
Replace `USERNAME` with your name.
|
||||
|
||||
1. Now set a password for the new user:
|
||||
|
||||
```bash
|
||||
sudo passwd USERNAME
|
||||
```
|
||||
1. For the new user to be able to use `sudo`, it has to be added to the `wheel` group:
|
||||
|
||||
```bash
|
||||
sudo usermod -aG wheel USERNAME
|
||||
```
|
||||
|
||||
`-aG` stands for _append to group(s)_.
|
||||
|
||||
(On debian based distros, the user should be added to the `sudo` group instead of `wheel`.)
|
||||
|
||||
1. Now, change your user to the new user:
|
||||
|
||||
```bash
|
||||
sudo su USERNAME
|
||||
```
|
||||
|
||||
You will see that the user name did change in the prompt.
|
||||
|
||||
1. Run the following command for verification:
|
||||
|
||||
```bash
|
||||
whoami
|
||||
```
|
||||
|
||||
It should not output "admin"!
|
||||
|
||||
Yes, the command is called `whoami`. Linux is kind of philosophical 🤔
|
||||
|
||||
1. Now, verify that you can run `sudo` as the new user:
|
||||
|
||||
```bash
|
||||
sudo whoami
|
||||
```
|
||||
|
||||
You should see "root" as output because `sudo` runs a command as the `root` user.
|
||||
|
||||
1. `cd` to the home directory of the new user.
|
||||
1. Make sure that you are in the home directory of the new user! Run `pwd` to verify that you are NOT in `/home/admin`. **`PLEASE DON'T TOUCH /home/admin/.ssh`** ⚠️ . Now, create the directory `~/.ssh` in the home directory of the new user. Change the permissions of `~/.ssh` such that only the user has read, write and execution permissions. _group_ and _others_ should have no permissions for `~/.ssh`!
|
||||
1. Create the file `authorized_keys` inside `~/.ssh`. Only the user should have read and write permissions for the file. _group_ and _others_ should have no permissions for the file!
|
||||
1. Copy the content of your public key file (with `.pub` as extention) to this file. It should be one line! Then save the file.
|
||||
1. Logout from the server. Go to `~/.ssh/config` that you did write at the beginning of this task. Change the user for the host `linux-lab` from `admin` to `USERNAME` where `USERNAME` is the name of the new user that you did create on the server.
|
||||
1. Try to connect using the host name again. If you did everything right, you should be connected and be the user that you did create. Run `whoami` to verify that the output is not "admin".
|
||||
|
||||
## Task 4: File transfer
|
||||
|
||||
Use `scp` and then `rsync` to transfer the files that you did create during the course to the server `linux-lab`.
|
||||
|
||||
Do you notice any differences between the two commands?
|
||||
|
||||
## Task 5: Nextcloud
|
||||
|
||||
In this task you will deploy your own cloud on the server: Nextcloud!
|
||||
|
||||
To do so, we will install Nextcloud as a container using `podman`.
|
||||
|
||||
In this task, you should connect as the user `admin` to the server. **Don't do this task as the user that you did create in the last task!** ⚠️
|
||||
|
||||
To connect as `admin` again, change the user for the host `linux-lab` in `~/.ssh/config` back to `admin` or use `ssh admin@linux-lab` instead of only `ssh linux-lab`.
|
||||
|
||||
You can find more information about the Nextcloud container here: https://hub.docker.com/\_/nextcloud
|
||||
|
||||
Create a directory called `nextcloudN` in the home directory of the user `admin`. `N` at the end stands for the number that you are using in the url to connect to the browser terminal `ttydN.mo8it.xyz`.
|
||||
|
||||
Create a container with the following options:
|
||||
|
||||
- Container name: nextcloudN. `N` at the end stands for the number that you are using in the url to connect to the browser terminal `ttydN.mo8it.xyz`.
|
||||
- Timezone: local
|
||||
- Network: traefik
|
||||
- Volume: Mount the directory `nextcloudN` that you did create into `/var/www/html` in the container. Use the label `Z`!
|
||||
- ... (I will continue the task description during the lunch break)
|
Loading…
Reference in a new issue