summaryrefslogtreecommitdiff
path: root/content/posts/basic_linux.md
diff options
context:
space:
mode:
Diffstat (limited to 'content/posts/basic_linux.md')
-rw-r--r--content/posts/basic_linux.md624
1 files changed, 624 insertions, 0 deletions
diff --git a/content/posts/basic_linux.md b/content/posts/basic_linux.md
new file mode 100644
index 0000000..ff30544
--- /dev/null
+++ b/content/posts/basic_linux.md
@@ -0,0 +1,624 @@
+---
+title: 'Linux Basics'
+description: 'A basic introduction to Linux'
+date: '2024-06-03'
+tags: ['linux', 'cli']
+toc: true
+url: basic-linux
+---
+
+This is a very brief introduction to working with Linux on the command line. It's a collection of commands and tips&tricks that I have collected through out my Linux journey. Some of it spesific to Debian derivatives. Maybe you find something usefull too. I will probably update this from time to time. You can look at the history if you want to see whats changed.
+
+<!--more-->
+
+## Find OS information
+
+Print information about your Linux distro.
+```console
+lsb_release -a
+cat /etc/os-release
+uname -a
+```
+
+See how long your machine has been running since last boot.
+
+```console
+claw0ry@lnx:~$ uptime
+ 11:36:40 up 4:02, 1 user, load average: 0.00, 0.00, 0.00
+```
+
+## Built-in documentation with manpages
+
+In Linux we can use the **man** command to read built-in documentation.
+
+```plaintext
+man COMMAND
+```
+
+To list all available manpages.
+
+```console
+man -k .
+```
+
+You can combine it with grep to filter the result if you are not quite sure what the manpage entry is called.
+
+```console
+claw0ry@lnx:~$ man -k . | grep ssh
+ssh (1) - OpenSSH remote login client
+ssh-add (1) - adds private key identities to the OpenSSH authentication agent
+ssh-agent (1) - OpenSSH authentication agent
+ssh-argv0 (1) - replaces the old ssh command-name as hostname handling
+ssh-copy-id (1) - use locally available keys to authorise logins on a remote machine
+ssh-keygen (1) - OpenSSH authentication key utility
+ssh-keyscan (1) - gather SSH public keys from servers
+ssh-keysign (8) - OpenSSH helper for host-based authentication
+ssh-pkcs11-helper (8) - OpenSSH helper for PKCS#11 support
+ssh-sk-helper (8) - OpenSSH helper for FIDO authenticator support
+ssh_config (5) - OpenSSH client configuration file
+sshd (8) - OpenSSH daemon
+sshd_config (5) - OpenSSH daemon configuration file
+~:$ man sshd
+```
+
+## Manage files and directories
+
+### List files and directories
+
+```console
+# list name of files and directories under /var
+ls /var
+
+# show permissions, owners, size, modification date etc for each file and directory in /var
+ls -l /var
+
+# same as above, but also recursivly
+ls -lR /var
+
+# '-h' lists sizes in human readble format, '-F' will append a '/' to all directories
+ls -lhF /var
+
+# '-a' will also list hidden files and directories (that starts with '.')
+ls -la $HOME
+```
+
+### Finding files
+
+```console
+# list all files and directories in /var
+find /var
+
+# list all files and directories in /var in 'ls' style
+find /var -ls
+
+# find all files that ends with '.log' in /var and execute 'type' on each file
+find /var -name "*.log" -exec type {} \;
+```
+
+### Create files
+
+```console
+touch file.txt
+
+vim file.txt
+
+nano file.txt
+
+echo "Some content" > file.txt
+
+cat file.txt > another_file.txt
+
+ls -lR /var > dir_list.txt
+```
+
+Write directly from **stdin** to file (also work with append).
+
+```console
+claw0ry@lnx:~$ cat > file.txt
+Write some
+lines
+of text
+<CTRL-D>
+claw0ry@lnx:~$ cat file.txt
+Write some
+lines
+of text
+```
+
+
+### Search content of files
+
+We can use **grep** to search for spesific phrases/words or patterns in a file or files.
+
+```console
+grep 'Failed' /var/log/auth.log
+```
+
+### Search logfiles
+
+Debian derivatives now use **journalctl** to display logs. Here are some basic filtering techniques.
+
+- '--since': Filter on time. Can use 'yesterday', 'today' or a datetime '2024-07-09', '2024-07-09 18:00:00'
+- '--grep': Filter using grep on the `MESSAGE=` field
+- '--unit': Filter on the service, e.g ssh, nginx, apache2 etc
+
+```console
+journalctl --since yesterday --grep 'failed' --unit ssh
+```
+
+### Archiving files and directories
+
+In Linux we use the **tar** command to create an archive. In most cases we also want to compress it with zip.
+
+- 'c': Create an archive
+- 'v': Verbose
+- 'z': Compress the archive with zip
+- 'f': Specify output file
+
+```console
+# backup my home directory to mybackup.tar.gz
+tar -cvzf mybackup.tar.gz /home/claw0ry
+```
+
+If we omit the 'z' flag, tar would create an archive with the exact same size as my homefolder.
+
+We can list the contents of a tar archive (or tarball).
+
+```console
+tar -tvf mybackup.tar.gz
+```
+
+To decompress or unpack an archive we also use **tar**.
+
+- 'x': Extract an archive
+- 'C': Use another directory than current working directory
+
+```console
+# extract to current working directory
+tar -xf mybackup.tar.gz
+
+# or to a specific directory
+tar -xf mybackup.tar.gz -C /tmp/backup
+```
+
+### Transfer files
+
+We can transfer files to and from other computers/servers with **scp** or **rsync**.
+
+NOTE: If we have the same username on both ends, we dont need to specify the USER.
+
+Using **scp**.
+
+```plaintext
+scp [src] [dest]
+
+# from local to remote
+scp [local-path] [USER@]HOST:[remote-path]
+
+# from remote to local
+scp [USER@]HOST:[remote-path] [local-path]
+```
+
+Using **rsync**.
+
+```plaintext
+rsync -aP [src] [dest]
+
+# from local to remote
+rsync -aP [local-path] [USER@]HOST:[remote-path]
+
+# from remote to local
+rsync -aP [USER@]HOST:[remote-path] [local-path]
+
+# optionally we can specify -n to do a dry-run to see what would happen
+rsync -naP [local-path] [USER@]HOST:[remote-path]
+```
+
+Real world examples.
+
+```console
+# copy my local '.bashrc' to a lab server
+scp /home/claw0ry/.bashrc lab_user@lab1.example.com:/home/lab_user/.bashrc
+
+# sync my blog folder to webserver
+rsync -aP /home/claw0ry/code/blog web.claw0ry.net:/var/www
+```
+
+### Change permissions, owners and groups
+
+Which files and directories can be accessed, modified etc by whom is determined by permissions and owners.
+
+We can see the permissions and owners of a file/directory with **ls**.
+
+```console
+claw0ry@lnx:~$ ls -la /home/cloud_user
+total 20
+drwxr-xr-x 3 cloud_user cloud_user 4096 Jul 9 08:25 .
+drwxr-xr-x 4 root root 4096 Aug 24 2023 ..
+-rw-r--r-- 1 cloud_user cloud_user 1 Feb 29 19:38 .bash_history
+-rw-r--r-- 1 cloud_user cloud_user 0 Feb 29 19:16 .cloud-locale-test.skip
+-rw------- 1 cloud_user cloud_user 57 Jul 9 08:17 .lesshst
+drwx------ 2 cloud_user cloud_user 4096 Aug 24 2023 .ssh
+-rw-r--r-- 1 cloud_user cloud_user 0 Aug 28 2023 .sudo_as_admin_successful
+```
+The first character idicates what kind of item it is:
+
+- '-': file
+- 'd': directory
+- 'l': symbolic link
+
+Next we have the permissions divided into three groups. The first three are the owners permissions, then we have the groups permissions and lastly others permissions.
+
+- '-': none
+- 'r': read
+- 'w': write
+- 'x': execute
+
+The owner of the file is specified in the first column that you see `cloud_user`, and the group is specified in the column next to it. In this example we can see that all files and directories is owned by the `cloud_user` user and `cloud_user` group execpt for the parent directory which is owned by `root` user and `root` group.
+
+#### Change owners and groups
+
+We can change the owner and group with the **chown** command.
+
+```plaintext
+chown [-R] [OWNER][:GROUP] FILE
+
+# only change owner
+chown OWNER FILE
+
+# only change group
+chown :GROUP FILE
+
+# change both, but not the same
+chown OWNER:GROUP FILE
+
+# change both to the same
+chown OWNER: FILE
+```
+
+- 'R': Recursive (will also change owner for all subfiles and directories)
+
+```console
+claw0ry@lnx:~$ cd /home/cloud_user
+claw0ry@lnx:~$ touch file.txt
+claw0ry@lnx:~$ ls -l file.txt
+-rw-r--r-- 1 cloud_user cloud_user 0 Jul 9 08:37 file.txt
+claw0ry@lnx:~$ chown another_user:another_user file.txt
+claw0ry@lnx:~$ ls -l file.txt
+-rw-r--r-- 1 another_user another_user 0 Jul 9 08:37 file.txt
+claw0ry@lnx:~$ chown cloud_user file.txt
+-rw-r--r-- 1 cloud_user another_user 0 Jul 9 08:37 file.txt
+claw0ry@lnx:~$ chown :cloud_user file.txt
+-rw-r--r-- 1 cloud_user cloud_user 0 Jul 9 08:37 file.txt
+```
+
+#### Change permissions
+
+To set permissions we use the **chmod** command.
+
+There are two modes to set permissions with; symbolic and octal.
+
+##### Octal mode
+
+```plaintext
+chmod OCTAL FILE
+```
+
+- read(r): 4
+- write(w): 2
+- execute(x): 1
+
+To calculate the permissions bits we just need to add the permissions together. So for read and write access it will be `4+2=6`. For all permissions it will be `4+2+1=7`.
+
+Let's say we have `file.txt` and we want the owner to have full permissions, the group to have read and write and others to have none. This would calculate to `760`. We can set these permissions with the following command.
+
+```console
+claw0ry@lnx:~$ chmod 760 file.txt
+claw0ry@lnx:~$ ls -l file.txt
+-rwxrw---- 1 cloud_user cloud_user 0 Jul 9 08:37 file.txt
+```
+
+These are the most common permissions used:
+
+- 777 (everyone has full permissions)
+- 644 (owner has read+write, and everyone else has read)
+- 750 (owner has full permissions, groups has read+execute, and everyone else has none)
+- 600 (owner is the only user that has access)
+
+##### symbolic mode
+
+```plaintext
+chmod MODE FILE
+```
+
+- '+': add permission
+- '-': remove permission
+- '=': set permisions
+- 'u': owner (user)
+- 'g': group
+- 'o': others
+
+```console
+# add read permissions for the owner
+chmod u+r file.txt
+
+# remove execute for owner
+chmod u-x file.txt
+
+# set owners permissions to read, write, execute
+chmod u=rwx file.txt
+
+```
+
+We can combine permissions with `,`.
+
+```console
+claw0ry@lnx:~$ ls -l file.txt
+-rwxrw---- 1 cloud_user cloud_user 0 Jul 9 08:37 file.txt
+claw0ry@lnx:~$ chmod u=rwx,g=rw,o=r file.txt
+claw0ry@lnx:~$ ls -l file.txt
+-rwxrw-r-- 1 cloud_user cloud_user 0 Jul 9 08:37 file.txt
+```
+
+## Input/output redirection
+
+In Linux shells there is a concept of three streams.
+
+- The standard input (stdin), which takes the users input.
+- The standard out (stdout), which is the output of a command. It is usually displayed in your terminal.
+- The standard error (stderr), which is the error messages from a command. This is also usually displayed in your terminal alongside stdout.
+
+Write errors to file instead of console.
+
+```console
+# no redirection
+claw0ry@lnx:~$ ls -l nonexisting
+ls: nonexisting: No such file or directory
+
+# with redirection of stderr
+claw0ry@lnx:~$ ls -l nonexisting 2> ls_error.txt
+claw0ry@lnx:~$ cat ls_error.txt
+ls: nonexisting: No such file or directory
+```
+
+Redirect **stdout** to a file and only show errors in the console.
+
+```console
+# these two are equivalent
+find /root 1> dirs_i_can_read.txt
+find /root > dirs_i_can_read.txt
+```
+
+Redirect both **stdout** and **stderr** to the same destination.
+
+```console
+find /root 2>&1 root_dirs.txt
+```
+
+This tells Linux to redirect **stderr** to **stdout** and then **stdout** to a file.
+
+
+## Reboot and PowerOff
+
+```plaintext
+shutdown [OPTIONS] [TIME] [WALL...]
+```
+
+```console
+# poweroff
+poweroff
+shutdown -P
+shutdown -P 20:00
+shutdown -P +5
+shutdown -P +5
+
+# reboot
+reboot
+shutdown -r [TIME]
+shutdown -r 20:00
+shutdown -r +5 'Server will be rebooted for maintenance!'
+```
+
+## Manage users and groups
+
+```console
+# Add a new user
+adduser LOGIN
+
+# add user to group
+gpasswd -a USER GROUP
+
+# give sudo access
+cat /etc/sudoers
+gpasswd -a USER sudo
+```
+
+## Disk space
+
+List filesystem space usage.
+
+```console
+claw0ry@lnx:~$ df -h
+Filesystem Size Used Avail Use% Mounted on
+udev 467M 0 467M 0% /dev
+tmpfs 96M 484K 95M 1% /run
+/dev/nvme0n1p1 20G 2.1G 17G 11% /
+tmpfs 477M 0 477M 0% /dev/shm
+tmpfs 5.0M 0 5.0M 0% /run/lock
+/dev/nvme0n1p15 124M 12M 113M 10% /boot/efi
+tmpfs 96M 0 96M 0% /run/user/1001
+tmpfs 96M 0 96M 0% /run/user/1002
+```
+
+List directory space usage.
+
+```console
+claw0ry@lnx:~$ du -hs /home/cloud_user
+36K /home/cloud_user
+claw0ry@lnx:~$ sudo du -hs /var/log
+55M /var/log
+```
+
+If we omit the `-s` we will also see subdirectories.
+
+```console
+claw0ry@lnx:~$ sudo du -h /var/log
+4.0K /var/log/runit/ssh
+8.0K /var/log/runit
+52K /var/log/apt
+4.0K /var/log/private
+53M /var/log/journal/ec228e8f22cbefcdced18ace3b891949
+53M /var/log/journal
+16K /var/log/unattended-upgrades
+32K /var/log/amazon/ssm/audits
+852K /var/log/amazon/ssm
+856K /var/log/amazon
+55M /var/log
+```
+
+You can also sort the result to find what takes the most space. Since we are using the `-h` flag on **du** to get human readable sizes, we also provide the same flag to **sort** so that I will sort correctly.
+
+```console
+claw0ry@lnx:~$ sudo du -h /var/log | sort -h
+4.0K /var/log/chrony
+4.0K /var/log/private
+4.0K /var/log/runit/ssh
+8.0K /var/log/runit
+36K /var/log/apt
+136K /var/log/nginx
+440K /var/log/sysstat
+25M /var/log
+25M /var/log/journal
+25M /var/log/journal/b8d53a40a48e4a9baaf67b1d19735980
+```
+
+To get the size of a file(s), you can use the **ls** command with `-lh` to get the size in human readable format.
+
+Another alternative is **ncdu** which is an interactive version of `du` built with ncurses. It does not come pre-installed.
+
+```console
+sudo apt install ncdu
+
+# replace /home with whatevery starting path you want
+ncdu /home
+```
+
+Now you can navigate and see the size of files and directories interactivly.
+
+## Processes
+
+Dashboard overview of your processes, CPU and memory usage.
+```console
+htop
+```
+
+Snapshot of the current process state.
+```console
+ps aux
+```
+
+Kill a process.
+
+```console
+pkill -9 PID
+```
+
+## Schedule tasks
+
+In Linux we use **cron** with a `crontab` file to scedule runs of commands or scripts.
+
+The crontab template looks like this.
+
+```plaintext
+# +----------- minute (0 - 59)
+# | +--------- hour (0 - 23)
+# | | +------- day of month (1 - 31)
+# | | | +----- month (1 - 12)
+# | | | | +--- day of week (0 - 6) (starts at sunday)
+# | | | | |
+# * * * * * COMMAND
+#
+# NOTES
+# The 'month' and 'day of week' can be represented by either a number, name or shortname.
+# e.g 1, January, Jan
+# e.g 1, Monday, Mon
+#
+# Command can be either a script or a command. You can seperate them with ';' to run
+# multiple commands.
+#
+# Visit https://crontab.guru for a visual representation of cron schedule
+```
+
+To edit your crontab you use the **crontab** command.
+
+```console
+crontab -e
+```
+
+You can also specify the user to edit crontab for if you want it to run as another user.
+
+```console
+crontab -u USER -e
+```
+
+> NOTE: When adding commands to your crontab, make sure you use full paths for both commands and scripts.
+
+You can check the cron logs using **journalctl**.
+
+```console
+journalctl --unit cron
+```
+
+## Manage and update packages
+
+### dpkg
+
+```console
+# install .deb package from file
+dpkg -i FILE.deb
+
+# list installed packages
+dpkg -l
+
+# remove package
+dpkg -r NAME
+
+# search installed packages
+dpkg -S PATTERN
+```
+
+NOTE: When intalling packages with `dpkg -i` it does not perform any dependency checks. If a dependency is missing it will fail.
+
+### apt
+
+```console
+# update package list
+apt update
+
+# upgrade installed packages
+apt upgrade
+
+# install package(s)
+apt install NAME
+
+# remove package
+apt remove NAME
+
+# remove package and config
+apt purge NAME
+
+# remove unwanted packages
+apt autoremove
+
+# search packages
+apt search PATTERN
+
+# show package details
+apt show NAME
+
+# list installed packages
+apt list --installed
+
+# list packages that can be upgraded
+apt list --upgradeable
+```