Linux Tutorial – Puntata 28

di jolek78

Care/i fruitrici e fruitori del blog, in questi post – ogni domenica mattina – si parlerà del sistema operativo GNU/Linux e degli strumenti per utilizzarlo al massimo delle potenzialità. Cercheremo di spiegare come funziona, cosa è il kernel, come costruirsi una vpn, come settare un firewall e giocare col terminale, usare adb e altro. Se il capitalismo della sorveglianza ci vuole passivi consumatori-consumatrici di servizi noi si risponde con un po’ di “cultura informatica” e un MARAMEO (quasi affettuoso). Buona lettura!

Uno dei pacchetti associati ad ssh che vengono utilizzati di più è scp, acronimo di secure copy. Permette, in buona sostanza, di copiare contenuti da una macchina all’altra utilizzando il protocollo sicuro ssh. Questo è utile in molti casi, sopratutto quando vogliamo, per esempio, muovere un backup da un posto all’altro, o per trasferire dei file di configurazione, o magari delle chiavi. scp, come ssh, è straordinariamente semplice e immediato da usare. Sopratutto dopo tutte le configurazioni effettuate la scorsa settimana. Per fare questo lavoro pero’ scp non è l’unico tool disponibile. Un altro tool è rsync, e molto spesso si rivela anche più comodo di scp per traferire interi gruppi di files, cartelle e sottocartelle. Ma magari di quello ne parleremo nella puntata in cui chiariremo come fare un backup, magari dopo un cronjob mensile. Parlo arabo? Tranquilli, è tutto normale… Bentornati!

scp

MAN

bottega@bottegadelbarbieri  ~  man scp |head -n 16
SCP(1) BSD General Commands Manual SCP(1)

NAME
scp — OpenSSH secure file copy

SYNOPSIS
scp [-346BCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file] [-J destination] [-l limit] [-o ssh_option] [-P port] [-S program] source ... target

DESCRIPTION
scp copies files between hosts on a network. It uses ssh(1) for data transfer, and uses the same authentication and provides the same security as ssh(1). scp will ask for passwords or passphrases if they are needed for authentication.

The source and target may be specified as a local pathname, a remote host with optional path in the form [user@]host:[path], or a URI in the form scp://[user@]host[:port][/path]. Local file names can be made explicit using absolute or relative pathnames to
avoid scp treating file names containing ‘:’ as host specifiers.

When copying between two remote hosts, if the URI format is used, a port may only be specified on the target if the -3 option is used.

Prima di cominciare: alcune configurazioni utilizzate non saranno quelle estese. Ci siamo creati il config file nella scorsa puntata proprio per evitare  di scrivere tutto, tutte le volte. Amministratori di sistema si, ma anche pigri a quanto pare… Per fare i test, utilizzeremo alcuni file che avevo salvato qualche settimana fa. Conservo ancora nel computer i file originali del mio vecchio telefono, il backup in sostanza che avevo salvato prima di muovere tutto dentro la ubuntu touch. A proposito: avete letto la puntata speciale?

scp <file> <destination>:<directory>

La sintassi del programma, come si può vedere, è immediata.  Proviamo quindi a spostare un solo file da jolek78 alla macchina virtuale della bottega:

  ~/D/Backup  scp Security/bookmarks.html bottega:/home/bottega/
bookmarks.html

Cosa e’ successo esattamente? Proviamo a vederlo mettendo l’opzione verbose:

 ~/D/Backup  scp -v Security/bookmarks.html bottega:/home/bottega/
Executing: program /usr/bin/ssh host bottega, user (unspecified), command scp -v -t /home/bottega/
OpenSSH_8.2p1 Ubuntu-4ubuntu0.3, OpenSSL 1.1.1f 31 Mar 2020
debug1: Reading configuration data /home/jolek78/.ssh/config
debug1: /home/jolek78/.ssh/config line 1: Applying options for bottega
debug1: Reading configuration data /etc/ssh/ssh_config
[...]
debug1: identity file /home/jolek78/.ssh/id_ed25519 type 3
debug1: identity file /home/jolek78/.ssh/id_ed25519-cert type -1
debug1: identity file /home/jolek78/.ssh/id_ed25519_sk type -1
debug1: identity file /home/jolek78/.ssh/id_ed25519_sk-cert type -1
[...]
debug1: Server host key: ssh-ed25519 SHA256:H083cEumXdSGOPl89dTJvTZtmtVsH1WNw9T4S7ITxOw
debug1: checking without port identifier
debug1: Host '192.168.0.27' is known and matches the ED25519 host key.
debug1: Found key in /home/jolek78/.ssh/known_hosts:1
debug1: found matching key w/out port
debug1: rekey out after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: rekey in after 134217728 blocks
[...]
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /home/jolek78/.ssh/id_ed25519 ED25519 SHA256:zTyk430ymiuBcregQ65SBkkz8jAubpNXlyVNRDL1LMI agent
debug1: Server accepts key: /home/jolek78/.ssh/id_ed25519 ED25519 SHA256:zTyk430ymiuBcregQ65SBkkz8jAubpNXlyVNRDL1LMI agent
debug1: Authentication succeeded (publickey).
Authenticated to 192.168.0.27 ([192.168.0.27]:2121).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: network
[...]
debug1: Sending command: scp -v -t /home/bottega/
Sending file modes: C0740 418722 bookmarks.html
Sink: C0740 418722 bookmarks.html
bookmarks.html 100% 409KB 59.4MB/s 00:00 
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
Transferred: sent 421560, received 2260 bytes, in 0.3 seconds
Bytes per second: sent 1506147.3, received 8074.5

Facendo una sorta di bignami di cosa e’ successo:


– Reading configuration data /home/jolek78/.ssh/config
scp va a leggere il file di configurazione

– identity file /home/jolek78/.ssh/id_ed25519 type 3
jolek78 fa la scansione di tutte le chiavi disponibili, inclusa la ed25519

– Host ‘192.168.0.27’ is known and matches the ED25519 host key.
jolek78 seleziona l’host e la chiave per connettersi

– Offering public key: /home/jolek78/.ssh/id_ed25519 ED25519
jolek78 propone a bottegadelbarbieri la chiave

– Server accepts key: /home/jolek78/.ssh/id_ed25519 ED25519
bottegadelbarbieri la controlla e la accetta

– Sending command: scp -v -t /home/bottega/
scp viene eseguito

– Transferred: sent 421560, received 2260 bytes, in 0.3 seconds
scp ci dà il report finale dell’operazione


E poi da dentro bottegadelbarbieri verifichiamo che il trasferimento sia avvenuto correttamente:

bottega@bottegadelbarbieri  ~  stat bookmarks.html
File: bookmarks.html
Size: 418722 Blocks: 824 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 657370 Links: 1
Access: (0740/-rwxr-----) Uid: ( 1000/ bottega) Gid: ( 1000/ bottega)
Access: 2021-09-25 23:41:30.519376716 +0100
Modify: 2021-09-25 23:13:43.204175389 +0100
Change: 2021-09-25 23:13:43.204175389 +0100
Birth: -

Per la serie “nota le differenze” guardate cosa è cambiato dal file originale al file copia:

~/D/Backup  stat Security/bookmarks.html 
File: Security/bookmarks.html
Size: 418722 Blocks: 824 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 9966123 Links: 1
Access: (0740/-rwxr-----) Uid: ( 1000/ jolek78) Gid: ( 1000/ jolek78)
Access: 2021-09-25 23:13:20.354603270 +0100
Modify: 2021-08-29 17:35:13.000000000 +0100
Change: 2021-08-29 17:47:48.633123867 +0100
Birth: -
scp <file1> <file1> <destination>:<directory>

Sorpresa, ma non troppo: scp ci permette di trasferire più file alla volta. Sposteremo ora i due file opml che contengono tutti i miei rss, sia per i podcast sia per il news feed:

~/D/Backup  scp Security/*.opml bottega:/home/bottega/
antennapod-feeds.opml 100% 7356 2.4MB/s 00:00 
feeder-feeds.opml

Da dentro bottegadelbarbieri verifichiamo che i due file esistano per davvero:

bottega@bottegadelbarbieri  ~  ls -lha *.opml
-rwxr----- 1 bottega bottega 7.2K Sep 26 00:06 antennapod-feeds.opml
-rwxr----- 1 bottega bottega 11K Sep 26 00:06 feeder-feeds.opml
scp -r <directory*> <destination>:<directory>

Ora pero’ vediamo come trasferire una intera directory, le sottodirectory, e successivi file. Basterà aggiungere il  parametro recursive al comando:

~/D/Backup  scp -r Security* bottega:/home/bottega/ 
bookmarks.html 100% 409KB 82.8MB/s 00:00 
feeder-feeds.opml 100% 11KB 22.0MB/s 00:00 
contacts.vcf 100% 92KB 65.2MB/s 00:00 
antennapod-feeds.opml 100% 7356 13.8MB/s 00:00 
password_export.json 100% 64KB 61.3MB/s 00:00

Da dentro bottegadelbarbieri verifichiamo che la directory esista:

bottega@bottegadelbarbieri  ~  ls -lha Security/
total 600
drwxrwxr-x 2 bottega 4096 Sep 26 00:42 .
drwxr-xr-x 20 bottega 4096 Sep 26 00:42 ..
-rwxr----- 1 bottega 7356 Sep 26 00:42 antennapod-feeds.opml
-rwxr----- 1 bottega 418722 Sep 26 00:42 bookmarks.html
-rwxr----- 1 bottega 94679 Sep 26 00:42 contacts.vcf
-rwxr----- 1 bottega 11041 Sep 26 00:42 feeder-feeds.opml
-rwxr----- 1 bottega 65278 Sep 26 00:42 password_export.json
scp -l <kbit/sec> <file> <destination>:<directory>

Immaginiamo ora di dover fare un trasferimento di un file molto grande, e di non voler impegnare troppa banda di connessione per farlo. Per fare questo, scp ci viene in aiuto col parametro limit che ci permette di definire quanti kilobit al secondo vogliamo trasferire. Nel nostro caso, proviamo a trasferire un file in pdf a 20 kbit:

  ~/Documents  scp -P 2121 -l 20 -v un-luddista-si-dondolava.pdf bottega:/home/bottega/
Executing: program /usr/bin/ssh host 192.168.0.27, user bottega, command scp -v -t /home/bottega/
OpenSSH_8.2p1 Ubuntu-4ubuntu0.3, OpenSSL 1.1.1f 31 Mar 2020
debug1: Reading configuration data /home/jolek78/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
[...]
debug1: Sending command: scp -v -t /home/bottega/
Sending file modes: C0664 530889 un-luddista-si-dondolava.pdf
Sink: C0664 530889 un-luddista-si-dondolava.pdf
un-luddista-si-dondolava.pdf 100% 518KB 2.5KB/s 03:24 
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
Transferred: sent 533888, received 2296 bytes, in 207.6 seconds
Bytes per second: sent 2571.3, received 11.1

Curioso sto luddista. Chissà cos’e’…

scp -c aes256-ctr <file> <destination>:<directory>

Vi ricordate il config file che la scorsa puntata abbiamo costruito per entrare dentro la bottega in ssh? Bene, torniamo a modificarlo un po’. Oltre alla scelta della chiave, in ssh, come ssl, gpg o altri, possiamo scegliere il sistema di cifratura. scp usa di default il aes-128, ma se volessimo sceglierne un piu’ sicuro, magari il aes-256, ci permette di definirlo manualmente con questa sintassi:

 ~/Documents  scp -c aes256-ctr -v un-luddista-si-dondolava.pdf bottega:/home/bottega/un-luddista-si-dondolava--aes256.pdf
Executing: program /usr/bin/ssh host bottega, user (unspecified), command scp -v -t /home/bottega/un-luddista-si-dondolava--aes256.pdf
OpenSSH_8.2p1 Ubuntu-4ubuntu0.3, OpenSSL 1.1.1f 31 Mar 2020
debug1: Reading configuration data /home/jolek78/.ssh/config
debug1: /home/jolek78/.ssh/config line 1: Applying options for bottega
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no files
debug1: /etc/ssh/ssh_config line 21: Applying options for *
debug1: Connecting to 192.168.0.27 [192.168.0.27] port 2121.
debug1: Connection established.
[...]
debug1: Sending command: scp -v -t /home/bottega/un-luddista-si-dondolava--aes256.pdf
Sending file modes: C0664 530889 un-luddista-si-dondolava.pdf
Sink: C0664 530889 un-luddista-si-dondolava.pdf
un-luddista-si-dondolava.pdf 100% 518KB 62.8MB/s 00:00 
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
Transferred: sent 533764, received 2436 bytes, in 0.2 seconds
Bytes per second: sent 2174324.9, received 9923.2
debug1: Exit status 0

Ma quali sono le cifrature disponibili?

 ~/Documents  sudo sshd -T | grep "ciphers"
[sudo] password for jolek78: 
ciphers chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com

E come facciamo a cambiare la cifratura utilizzata di modo che ssh ed scp utilizzino aes-256 durante la connessione a bottegadelbarbieri? È arrivato il momento di aggiungere una linea al nostro file:

~/Documents  vim ~/.ssh/config

~/Documents  cat ~/.ssh/config
Host bottega
hostname 192.168.0.27
user bottega
port 2121
HostKeyAlgorithms ssh-ed25519
Ciphers aes256-ctr    <<<<<<<
IdentityFile ~/.ssh/id_ed25519

Ed ora:

 ~/Documents  scp -v un-luddista-si-dondolava.pdf bottega:/home/bottega/un-luddista-si-dondolava--aes256.pdf
Executing: program /usr/bin/ssh host bottega, user (unspecified), command scp -v -t /home/bottega/un-luddista-si-dondolava--aes256.pdf
OpenSSH_8.2p1 Ubuntu-4ubuntu0.3, OpenSSL 1.1.1f 31 Mar 2020
debug1: Reading configuration data /home/jolek78/.ssh/config
debug1: /home/jolek78/.ssh/config line 1: Applying options for bottega
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no files
debug1: /etc/ssh/ssh_config line 21: Applying options for *
debug1: Connecting to 192.168.0.27 [192.168.0.27] port 2121.
debug1: Connection established
[...]

debug1: kex: server->client cipher: aes256-ctr MAC: umac-64-etm@openssh.com compression: none
debug1: kex: client->server cipher: aes256-ctr MAC: umac-64-etm@openssh.com compression: none

[...]
debug1: Sending environment.
debug1: Sending env LANG = en_GB.UTF-8
debug1: Sending command: scp -v -t /home/bottega/un-luddista-si-dondolava--aes256.pdf
Sending file modes: C0664 530889 un-luddista-si-dondolava.pdf
Sink: C0664 530889 un-luddista-si-dondolava.pdf
un-luddista-si-dondolava.pdf 100% 518KB 120.2MB/s 00:00 
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
Transferred: sent 533276, received 2396 bytes, in 0.3 seconds
Bytes per second: sent 1907926.8, received 8572.3

Un piccolo passo per un… vabbe’, quella cosa la’…

Alla prossima settimana!
jolek78

>> Indice <<
Puntata 27 < > Puntata 29

Il logo “Tux Linux” e’ stato realizzato e distribuito dall’artista deiby-ybied su Deviantart in licenza Creative Commons BY-NC-SA 3.0

jolek78 on Email
jolek78
Un tizio che pensava di essere uno scienziato. Si ritrovò divulgatore scientifico. Poi si addormentò su un aereo e si risvegliò informatico. Ma era sempre lui.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *