Come Usare SFTP per Trasferire File in Modo Sicuro con un Server Remoto

Introduzione

FTP, il File Transfer Protocol, era un metodo popolare e non crittografato per il trasferimento di file tra due sistemi remoti. A partire dal 2022, è stato deprecato dalla maggior parte del software moderno a causa della mancanza di sicurezza e può essere utilizzato principalmente solo in applicazioni legacy.

SFTP, che sta per Secure File Transfer Protocol, è un protocollo separato integrato in SSH che può implementare comandi FTP su una connessione sicura. Tipicamente, può fungere da sostituto immediato in qualsiasi contesto in cui sia ancora necessario un server FTP.

Nella maggior parte dei casi, SFTP è preferibile a FTP a causa delle sue caratteristiche di sicurezza sottostanti e della capacità di sfruttare una connessione SSH. FTP è un protocollo non sicuro che dovrebbe essere utilizzato solo in casi limitati o su reti di fiducia.

Anche se SFTP è integrato in molti strumenti grafici, questa guida mostrerà come utilizzarlo attraverso la sua interfaccia a riga di comando interattiva.

Come Connettersi con SFTP

Per impostazione predefinita, SFTP utilizza il protocollo SSH per autenticare e stabilire una connessione sicura. A causa di ciò, sono disponibili gli stessi metodi di autenticazione presenti in SSH.

Sebbene tu possa autenticarti con le password di default, ti consigliamo di creare chiavi SSH e trasferire la tua chiave pubblica su qualsiasi sistema a cui devi accedere. Questo è molto più sicuro e può risparmiarti tempo nel lungo periodo.

Consulta questa guida per configurare le chiavi SSH per accedere al tuo server se non lo hai già fatto.

Se riesci a connetterti alla macchina usando SSH, allora hai completato tutti i requisiti necessari per utilizzare SFTP per gestire i file. Testa l’accesso SSH con il seguente comando:

  1. ssh sammy@your_server_ip_or_remote_hostname

Se funziona, esci digitando:

  1. exit

Ora possiamo stabilire una sessione SFTP emettendo il seguente comando:

  1. sftp sammy@your_server_ip_or_remote_hostname

Ti connetterai al sistema remoto e il tuo prompt cambierà in un prompt SFTP.

Se stai lavorando su una porta SSH personalizzata (non la porta predefinita 22), puoi aprire una sessione SFTP come segue:

  1. sftp -oPort=custom_port sammy@your_server_ip_or_remote_hostname

Questo ti connetterà al sistema remoto tramite la porta specificata.

Ottieni Aiuto in SFTP

Il comando più utile da imparare prima di tutto è il comando di aiuto. Questo ti dà accesso a un riassunto degli altri comandi SFTP. Puoi chiamarlo digitando uno di questi comandi nel prompt:

  1. help

o

  1. ?

Questo mostrerà un elenco dei comandi disponibili:

Output
Available commands: bye Quit sftp cd path Change remote directory to 'path' chgrp grp path Change group of file 'path' to 'grp' chmod mode path Change permissions of file 'path' to 'mode' chown own path Change owner of file 'path' to 'own' df [-hi] [path] Display statistics for current directory or filesystem containing 'path' exit Quit sftp get [-Ppr] remote [local] Download file help Display this help text lcd path Change local directory to 'path' . . .

Esploreremo alcuni dei comandi che vedrai nelle seguenti sezioni.

Possiamo navigare attraverso la gerarchia dei file del sistema remoto usando una serie di comandi che funzionano in modo simile ai loro corrispettivi nella shell.

Per prima cosa, orientiamoci scoprendo in quale directory ci troviamo attualmente nel sistema remoto. Proprio come in una sessione di shell tipica, possiamo digitare quanto segue per ottenere la directory corrente:

  1. pwd
Output
Remote working directory: /home/demouser

Possiamo visualizzare i contenuti della directory corrente del sistema remoto con un altro comando familiare:

  1. ls
Output
Summary.txt info.html temp.txt testDirectory

Nota che i comandi disponibili nell’interfaccia SFTP non corrispondono esattamente alla sintassi tipica della shell e non sono altrettanto ricchi di funzionalità. Tuttavia, implementano alcune delle opzioni più importanti, come l’aggiunta di -la a ls per visualizzare più metadati e permessi dei file:

  1. ls -la
Output
drwxr-xr-x 5 demouser demouser 4096 Aug 13 15:11 . drwxr-xr-x 3 root root 4096 Aug 13 15:02 .. -rw------- 1 demouser demouser 5 Aug 13 15:04 .bash_history -rw-r--r-- 1 demouser demouser 220 Aug 13 15:02 .bash_logout -rw-r--r-- 1 demouser demouser 3486 Aug 13 15:02 .bashrc drwx------ 2 demouser demouser 4096 Aug 13 15:04 .cache -rw-r--r-- 1 demouser demouser 675 Aug 13 15:02 .profile . . .

Per accedere a un’altra directory, possiamo emettere questo comando:

  1. cd testDirectory

Ora possiamo attraversare il sistema di file remoto, ma cosa succede se dobbiamo accedere al nostro sistema di file locale? Possiamo dirigere i comandi verso il sistema di file locale precedendoli con una l per locale.

Tutti i comandi discussi finora hanno equivalenti locali. Possiamo stampare la directory di lavoro locale:

  1. lpwd
Output
Local working directory: /Users/demouser

Possiamo elencare i contenuti della directory corrente sulla macchina locale:

  1. lls
Output
Desktop local.txt test.html Documents analysis.rtf zebra.html

Possiamo anche cambiare la directory con cui vogliamo interagire sul sistema locale:

  1. lcd Desktop

Trasferimento di file con SFTP

Se vogliamo scaricare file dal nostro host remoto, possiamo farlo usando il comando get:

  1. get remoteFile
Output
Fetching /home/demouser/remoteFile to remoteFile /home/demouser/remoteFile 100% 37KB 36.8KB/s 00:01

Come puoi vedere, per impostazione predefinita, il comando get scarica un file remoto in un file con lo stesso nome sul sistema file locale.

Possiamo copiare il file remoto con un nome diverso specificando il nome successivamente:

  1. get remoteFile localFile

Il comando get accetta anche alcune opzioni. Ad esempio, possiamo copiare una directory e tutti i suoi contenuti specificando l’opzione ricorsiva:

  1. get -r someDirectory

Possiamo dire a SFTP di mantenere le autorizzazioni e gli orari di accesso appropriati usando il flag -P o -p:

  1. get -Pr someDirectory

Trasferimento di file locali al sistema remoto

Il trasferimento di file al sistema remoto funziona allo stesso modo, ma con un comando put:

  1. put localFile
Output
Uploading localFile to /home/demouser/localFile localFile 100% 7607 7.4KB/s 00:00

Le stesse opzioni che funzionano con get si applicano a put. Quindi per copiare un’intera directory locale, è possibile eseguire put -r:

  1. put -r localDirectory

Uno strumento familiare utile durante il download e l’upload di file è il comando df, che funziona in modo simile alla versione della riga di comando. Utilizzando questo, puoi verificare di avere abbastanza spazio per completare i trasferimenti che ti interessano:

  1. df -h
Output
Size Used Avail (root) %Capacity 19.9GB 1016MB 17.9GB 18.9GB 4%

Si noti che non esiste una variazione locale di questo comando, ma possiamo aggirare questo problema emettendo il comando !.

Il comando ! ci porta in una shell locale, dove possiamo eseguire qualsiasi comando disponibile sul nostro sistema locale. Possiamo controllare l’utilizzo del disco digitando:

  1. !

e poi

  1. df -h
Output
Filesystem Size Used Avail Capacity Mounted on /dev/disk0s2 595Gi 52Gi 544Gi 9% / devfs 181Ki 181Ki 0Bi 100% /dev map -hosts 0Bi 0Bi 0Bi 100% /net map auto_home 0Bi 0Bi 0Bi 100% /home

Qualsiasi altro comando locale funzionerà come previsto. Per tornare alla sessione SFTP, digita:

  1. exit

Dovresti ora vedere il prompt SFTP tornare.

Manipolazioni di file semplici con SFTP

SFTP ti consente di eseguire alcuni tipi di manutenzione del filesystem. Ad esempio, puoi cambiare il proprietario di un file sul sistema remoto con:

  1. chown userID file

Si noti come, a differenza del comando di sistema chmod, il comando SFTP non accetta nomi utente, ma utilizza invece gli UID. Sfortunatamente, non esiste un modo integrato per conoscere l’UID appropriato dall’interfaccia SFTP.

Come soluzione alternativa, è possibile leggere dal file /etc/passwd, che associa i nomi utente agli UID nella maggior parte degli ambienti Linux:

  1. get /etc/passwd
  2. !less passwd
Output
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh . . .

Nota come invece di dare il comando ! da solo, lo abbiamo usato come prefisso per un comando shell locale. Questo funziona per eseguire qualsiasi comando disponibile sulla nostra macchina locale e avrebbe potuto essere usato con il comando locale df precedentemente.

L’UID sarà nella terza colonna del file, come delimitato dai caratteri dei due punti.

Allo stesso modo, possiamo cambiare il proprietario del gruppo di un file con:

  1. chgrp groupID file

Di nuovo, non c’è un modo integrato per ottenere un elenco dei gruppi del sistema remoto. Possiamo aggirare il problema con il seguente comando:

  1. get /etc/group
  2. !less group
Output
root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4: tty:x:5: disk:x:6: lp:x:7: . . .

La terza colonna contiene l’ID del gruppo associato al nome nella prima colonna. Questo è ciò che stiamo cercando.

Il comando SFTP chmod funziona normalmente sul filesystem remoto:

  1. chmod 777 publicFile
Output
Changing mode on /home/demouser/publicFile

Non c’è un comando equivalente per manipolare i permessi dei file locali, ma è possibile impostare il umask locale, in modo che tutti i file copiati sul sistema locale abbiano i loro permessi corrispondenti.

Questo può essere fatto con il comando lumask:

  1. lumask 022
Output
Local umask: 022

Ora tutti i file regolari scaricati (a condizione che non venga utilizzata l’opzione -p) avranno i permessi 644.

SFTP consente anche di creare directory sia nei sistemi locali che remoti con lmkdir e mkdir rispettivamente.

Il resto dei comandi sui file si riferisce solo al filesystem remoto:

  1. ln
  2. rm
  3. rmdir

Questi comandi replicano il comportamento principale dei loro equivalenti shell. Se devi eseguire queste azioni sul filesystem locale, ricorda che puoi passare a una shell emettendo questo comando:

  1. !

O eseguire un singolo comando sul sistema locale anteponendo il comando con ! così:

  1. !chmod 644 somefile

Quando hai finito la sessione SFTP, usa exit o bye per chiudere la connessione.

  1. bye

Conclusione

Sebbene la sintassi SFTP sia molto meno esaustiva rispetto agli strumenti moderni della shell, può essere utile per garantire la compatibilità con la sintassi FTP legacy o per limitare attentamente le funzionalità disponibili agli utenti remoti di alcuni ambienti.

Ad esempio, puoi utilizzare SFTP per abilitare determinati utenti al trasferimento di file senza accesso SSH. Per ulteriori informazioni su questo processo, consulta il nostro tutorial su Come Abilitare SFTP Senza Accesso alla Shell.

Se sei abituato a utilizzare FTP o SCP per effettuare i tuoi trasferimenti, SFTP è un buon modo per sfruttare i punti di forza di entrambi. Anche se non è appropriato per ogni situazione, è uno strumento flessibile da avere nel tuo repertorio.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-sftp-to-securely-transfer-files-with-a-remote-server