Linux Base
Raccolta di concetti base su Linux e di comandi base utili, in particolare per la gestione server.
Controllare la versione di linux e della macchina¶
- Linux system admin commands
- Linux commands for system admin
-
Verificare distribuzione in uso e info sistema:
cat /etc/*release
- Verificare info su kernel linux in uso e architettura:
uname -a
oppureuname -r
- Verificare utenti attuali e gruppi associati:
groups <username>
- è anche possibile verificare gli utenti attivi facendo:
cat /etc/passwd
o anchecat /etc/passwd | grep "jeydi"
- Copiare un file mantenendo i permessi (o una cartella):
cp -p -r
- User account dettagli:
getent passwd <username>
id <username>
- Verificare utenti connessi sistema e cosa fanno:
w
who -u
- last logged into system:
last
oppurelast -a
oppurelast -ap now
lastlog
- Visualizzre file size, permessi e info utente:
ls -lh
- Aggiungere e gestire utenti, link di esempio
- visualizzare elenco lista degli utenti (users):
cat /etc/passwd
cat /etc/passwd | grep /home | cut -d: -f1
getent passwd|cut -d: -f1|sort
adduser <newaccount>
useradd <newaccount>
- full account summary is stored into the file:
/etc/passwd
- modificare utente:
usermod [options] [username]
- verificare tutti i cambiamenti che sono stati fatti su un utente con altre info:
chage -l <username>
- togliere accesso bash ad un utente:
sudo chsh -s /bin/false <username>
- aggiungere utente ad un gruppo:
usermod -a -G group <username>
- verificare gruppo o gruppi dell’utente:
groups <username>
- rimuovere utente da un gruppo:
sudo deluser <username> <group>
- aggiungere chiave pubblica ad un utente:
ssh user@ip 'cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub
- cancellare un utente:
sudo userdel <username>
- Password policy expiration (verificare scadenza password)
sudo chage -l <username>
- Cambiare password policy expiration per un utente:
sudo chage <username>
- Verificare indirizzo ip:
curl ifconfig.me
- installare net-tools per avere if config:
sudo apt install net-tools
- usando: if config:
ifconfig -a
- usando: ip:
ip addr
oppureip addr (ip a)
- Cambiare default shell per un utente: https://www.tecmint.com/change-a-users-default-shell-in-linux
- Verificare cartella attuale in cui sei:
pwd
- Verificare tempo (date and time, ora, hours):
timedatectl
- Verificare path completo del file:
readlink -f <nomefile>
- andare nella home utente con cd:
cd -
- Verificare ram esistente:
free -h
- verify info about the ram:
sudo dmidecode --type memory | less
- Verificare tutte le risorse della macchina (facilmente e in modo riassuntivo)
- GPU:
sudo lshw -C display
- CPU:
sudo lshw -C cpu
- Memory:
sudo lshw -C memory
- Disk:
sudo lshw -C disk
- GPU:
- Verificare cpu e risorse in uso:
top
oppuretop -i
oppure usare e installarehtop
oppure ancora meglio:bashtop
q
- if you want to exitM
– sort task list by memory usageP
– sort task list by processor usageN
– sort task list by process IDT
– sort task list by run time
- V**erificare informazioni su un processo**:
ps -aux
- Oppure cercare PID processo con:
pgrep <options> <pattern>
l
. List both the process names and the PIDs.n
. Return the process that is newest.o
. Return the process that is oldest.u
. Only find processes that belong to a specific user.x
. Only find processes that exactly match the given pattern.
- Oppure cercare PID processo con:
- Chiudere e distruggere un processo attivo:
kill <processID
kill -9 <processID>
lancia un SIGKILL che termina subito il processokillall <process>
kill a process by namee
. Find an exact match for the process name.I
. Ignore case when trying to find the process name.i
. Ask for additional confirmation when killing the process.u
. Only kill processes owned by a specific user.v
. Report back on whether the process has been successfully killed.
- verificare dischi montati nel sistema e utilizzo:
df -Th
- modo più facile e pulito:
lsblk
- modo più completo:
findmnt
- modo più facile e pulito:
- Verificare dimensione su disco dei file (in gb) disk space dimension:
ls -lha
- Check the disk space
du -sh
- Usare df:
df -h --output=source,fstype,size,used,avail,pcent,target -x tmpfs -x devtmpfs
oppure semplicementedf -h
- Per vedere bene in gb:
df -Th
- Per vedere singoli file (ad esempio spazio di tutti gli utenti root):
sudo du -hs *
- List partition with parted:
sudo parted -l
- Most used to check partitions:
sudo fdisk -l
- Best tool to check space: (you have to install with: sudo apt install pydf)
pydf
- Mount e unmount dei dischi su ubuntu: https://www.howtogeek.com/414634/how-to-mount-and-unmount-storage-devices-from-the-linux-terminal/
- Netstat per verificare porte e connessioni https://www.tecmint.com/20-netstat-commands-for-linux-network-management/
- see all the ports running with traffic:
sudo lsof -i -P -n | grep "LISTEN"
- listing all ports:
netstat -a | more
- list all tcp:
netstat -at
- all listening port connections:
netstat -l
- show statistics by protocol:
netstat -s
- show service name by PID:
netstat -tp
- find http connection netstats:
netstat -ap | grep http
- Verificare connessione dove vanno e quando vanno:
ss -t -a
- see all the ports running with traffic:
- Aggiornare lingua e locale (a volta capita che non trova un tipo di lingua)
sudo dpkg-reconfigure locales
- Trovare dei file nel sistema
locate <nomefile>
- contare numero di file che ci sono con quel nome:
locale -c <nomefile>
- aggiornare elenco file
sudo updatedb
- Utilizzare Tar per estrarre e comprimere files, oppure zip e unzip
- untar:
tar -xvf allfiles.tar
- tar:
tar -zcvf allfiles.tar.gz myfiles
- unpack a compressed archive:
tar -zxvf allfiles.tar.gz
- untar:
- Copiare un file tra 2 server e un terzo PC (remember to setup
~/.ssh/config
file)scp -r -3 machine_1:/folder1 machine_2:/folder1
- Copiare un file in un altro server usando SCP
scp -p -r ./folder/* server:/folder
- Copiare un file usando rsync:
rsync -avzh -e "ssh -i ~/.ssh/jeydi -p 22" user@machine:<source> <destination>
- on linux you can use verbosity:
rsync -avzh --progress --stats -e "ssh -i ~/.ssh/jeydi -p 22" user@machine:<source> <destination>
- Copy a file locally by excluding certain folders:
rsync -avzh --exclude "venv" intella-dev-1:/home/rossini/POC ~/Downloads/intella
- Gestire le partizioni su Linux:
- The primary way of resizing to fit the new bounds.
- Extend and resize a linux device mapper partition
- you can use parted:
sudo parted
- Espandere una partizione esistente di un disco:
fdisk
Monitorare il server o la macchina¶
Per monitorare la macchina o il server è possibile utilizzare sempre htop
oppure top
, tuttavia ci sono degli strumenti da linea di comando che rendono questa attività più facile e intuitiva.
Noi ci sentiamo di raccomandare bashtop
che secondo noi è un ottimo strumento e lo usiamo molto spesso.
È molto facile da installare e da utilizzare, funziona su tutti i sistemi operativi.
Altri comandi utili¶
#Utile per lavorare con i dati: lanciare job che funzionano anche chiudendo terminale
nohup <your command &>
#move all files in the folder to the previous one
find . -maxdepth 1 -exec mv {} .. \;
#or
cd to/the/dir
mv * ../
#or
mv *.* ..
Monitorare utilizzo di memoria (utile metterlo anche alla fine di un job che stampa questa informazione, ad esempio in un cron): /usr/bin/time -v mio_processo
Visualizzare numero di righe di un file: wc -l yourTextFile
Aggiungere un utente (add user) to linux
# PROCEDURA PER AGGIUNGERE UN UTENTE E PER IMPOSTARE CHIAVE PUBBLICA
# 1. create new user with useradd
sudo useradd -m -d /home/<name> -s /bin/bash <name>
# 2. set the user password
passwd username
# 3. copy public key to file (one key per line)
# /home/<name>/.ssh/authorized_keys
# 4. Check permissions on the files
# ensure the directory ir owned by the new user
chown -R <name>:<name> /home/<name>/.ssh
# make sure only the new user has permissions
chmod 700 /home/<name>/.ssh
chmod 600 /home/<name>/.ssh/authorized_keys
# add user to sudo group or other groups
sudo usermod -a -G sudo <name>
# POSSIBILI COMANDI PER AGGIUNGERE UN UTENTE LINUX
# add user (probably without creating home directory)
sudo useradd <name>
# add user creating home directory
sudo useradd -m <name>
# set a password for the user
sudo passwd <name>
# create user with specific home directory
sudo useradd -m -d /opt/<name> <name>
# create user with specific user id
sudo useradd -u 1500 <name>
# check user id
id -u <name>
# create user with specific group id
sudo useradd -g users <name>
# verify user group ids
id -gn <name>
# create user and assign to multiple groups
sudo useradd -g users -G wheel,developers <name>
# delete an user
sudo userdel <username>
File Ownership, groups and permissions¶
Guida su cosa sono i permessi e come si usano su Linux
Altre informazioni sui permessi e su chiavi ssh
#change permission to the folder and all subfolders and subfiles
sudo chmod -R 755 ./folder
#change ownership folder and all subfolders and files
sudo chown -R $(whoami) ./folder
#change group to folder, subfolder and files
sudo chgrp guzzo ./folder
#make all .sh files executable
find ./yourfolder -type f -iname "*.sh" -exec chmod +x {} \;
Cercare file su Linux¶
How to find files and folder using command line
Find files with a specific containing text
#Find is easy but it slow
#Find all files in current directory starting with "pro"
find . -name pro\*
##LOCATE is fast because it's pre-build
#build locate
sudo updatedb
locate mydata
#find files or folder containing exactly search criteria
locate -b ‘\mydata’
Redirect - Salvare output, testo o info in un file (csv)¶
redirect the output to a file with >
or &>
... I was asked to move it from comments to answers, so here it is.
Putting >
in between a command and a filename will overwrite the current contents of the file with standard out.
Putting >>
appends to a file.
Putting a &
before the redirector will also catch standard error (in Bash > 4).
Warning if you want to insert special char like '\n' need to put $ before the string.
Port forward linux (from server to local)¶
Complete guide port forwarding
Come usare Screen¶
Screen è uno strumento molto potente che consente di lanciare dei processi in background in un server senza che questi processi o programmi vengano chiusi al momento della chiusura del terminale.
Screen è uno strumento base che viene ancora utilizzato, tuttavia consigliamo di utilizzare tmux invece di screen per una migliore compatibilità e funzionalità.
Guida comprensiva su come usare screen
#start a named session
screen -S session_name
# detach to any session active
Ctrl+a d
#find active sessions
screen -ls
#give a name of an existing session (you have to entere it before)
screen -t <title>
#reattach to the previous session
screen -r <session_id>
#remove a session
screen -X -S [session # you want to kill] quit
# remove a dead session
screen -wipe
#enable screen logging
screen -L
Come usare tmux¶
Tmux nuovo e più supportato rispetto a screen, puoi fare più cose in combinazione con altro ad esempio: vim
# create a session
tmux new -s session_name
# visualize sessions
tmux ls
# visualize windows
tmux list-windows
# attach a session
tmux att -t 0
# attach a window in a session
tmux attach-session -t <session-name>
# give a name of a window
tmux rename-window <new-window-name>
# give a name of a session
tmux rename-session <new-session-name>
# delete a window
tmux kill-window -t <window-name>
# delete a session
tmux kill-session -t <session-name>
Comandi quando sei all'interno di una sessione o di una window.
#create a new window
CTRL + B C
# rename a window
CTERL + B .
# visualize other windows
CTRL + B W
# visualize the sessions
CTRL + B S
CTRL + B V
# detach
CRTL + B D
#split the window
CTRL + B %
#slit vertical
CTRL + B "
# quit
CTRL + B Q
# move focus to a specific window
CTRL + B <numero>
# move in senso orario finestra
CTRL + B O
# focus sulla finestra principale
CTRL + B CTRL + 0
# rearrange windows
CTRL + B space
# muovere dimensione finestre
CTRL
# zoom mode (also turn back to the zoom mode)
CTRL + B Z
# Break current pane out of the window
CTRL + B !
Ring the bell on terminal with tmux on other windows¶
You can do it manually for a single command <yourcommand> && tput bel
You can also setup use the bell externally with tmux command: tmux send-keys -t <window-name> C-g
Or you can setup the bell globally. You can use the bell-style
option in your tmux configuration to specify how the bell should be displayed. Here's an example:
- Open your
~/.tmux.conf
file in a text editor. - Add the following line to the file:
set-option -g bell-style any
This sets the bell-style
option to any
, which will ring the bell on the terminal when any activity occurs in a tmux window or pane.
- Save and close the file.
- Reload your tmux configuration by running the following command:
tmux source-file ~/.tmux.conf
This will apply the changes to your tmux configuration.
Terminal Disk Analyzer¶
Ncurses disk usage (NCU)¶
sudo apt install ncdu
- launch:
ncdu
- scan all:
ncdu -x /
- scan from ssh:
ssh -C user@system ncdu -o- / | ./ncdu -f-
DUC¶
sudo apt install duc
- setup duc to create the file index:
duc index /usr
- terminal view:
duc gui /usr
- UI view:
duc ui /usr
Dutree¶
- Per installarlo serve avere rust, qui le istruzioni
SSHD Config¶
Come configurare SSH all'interno di una macchina?
Mettiamo qui alcuni appunti, poi consigliamo di seguire la guida: Indipendenza tecnologica
che abbiamo scritto a riguardo
Qui l'elenco dei settings che utilizziamo principalmente
# modify the sshd file
sudo nano /etc/ssh/sshd_config
# make a copy original sshd_config
sudo cp /etc/ssh/sshd_config /etc/ssh/old_config
sudo rm /etc/ssh/sshd_config
# create a new file with new stuff
sudo vim /etc/ssh/sshd_config
# Add inside the new file
Include /etc/ssh/sshd_config.d/*.conf
UsePAM yes
PrintMotd yes
PrintLastLog yes
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
ChallengeResponseAuthentication no
Port 9922
X11Forwarding no
IgnoreRhosts yes
UseDNS yes
PermitRootLogin prohibit-password
DenyUsers test
AllowUsers jeydi
PermitEmptyPasswords no
PubkeyAuthentication yes
PasswordAuthentication no
MaxAuthTries 3
PermitRootLogin no
Protocol 2
# restart sshd
sudo systemctl restart sshd
Audit and harden your ssh configuration
Linux unix bsd openssh server best practice
Installare e configurare Fail2Ban¶
Fail2Ban è uno strumento di gestione server che consente di mandare in "prigione" persone indesiderate che cercano con vari tentativi di entrare all'interno del server.
È molto comodo per aumentare la sicurezza del server
Anche in questo caso rimandiamo alla guida: Indipendenza tecnologica
per ulteriori dettagli su come configurare un server.
Come installare e configurare Fail2Ban su Ubuntu 20.04
# Install
sudo apt install fail2ban
# check status
sudo systemctl status fail2ban
# make a copy original fail2ban config
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo rm /etc/fail2ban/jail.conf
# create the new file
sudo vim /etc/fail2ban/jail.conf
# add config
ignoreip = 127.0.0.1/8 ::1 10.10.10.5 10.10.10.80
bantime = 10m
findtime = 10m
maxretry = 5
maxmatches = %(maxretry)s
Comandi utili di Fail2Ban¶
Elenco di comandi utili per Fail2Ban per gestirlo all'interno di un server.
Guida con tutti i comandi e informazioni
Ricorda che per questi comandi è molto probabile che necessiti dei permessi di sudo
.
In generale Fail2Ban ti consente di creare una jail (una prigione), all'interno di quella prigione allo scattare di determinate regole che vanno configurate all'interno del file: /etc/fail2ban/jail.local
oppure in quello globale: /etc/fail2ban/jail.conf
.
Raccomandiamo sempre di usare il file /etc/fail2ban/jail.local
e non jail.conf
, quindi al momento della configurazione è sempre importante fare una copia di jail.conf
su jail.local
e modificare questo file.
Quando scattano determinate regole impostate nei file di configurazione un particolare ip viene messo all'interno di una jail.
# Verify fail2ban server is alive
fail2ban-client ping
# Retrieve current status, can give you the jail names
fail2ban-client status
# When you identify the name of the jail you can launch
# Retrieve information about a specific jail
fail2ban-client status <jail_name>
# Remove the specified IP from the jail service’s ban list
fail2ban-client set <jail_name> unbanip <ip_address>
# Ban ip address
fail2ban-client set <jail_name> banip <ip_address>
# Ban ip address for a specific time
fail2ban-client set <jail_name> bantime <ban_time>
# Set the find time for a jail
fail2ban-client set <jail_name> findtime <find_time>
# Reload the service
fail2ban-client reload
Una guida su come configurare Fail2Ban