Introduzione
FTP, File Transfer Protocol, era un protocollo molto diffuso e non crittografato per trasferire file tra due sistemi remoti. Ad oggi risulta deprecato dalla maggior parte dei moderni software data la mancanza di sicurezza e può essere utilizzato solo per applicativi legacy.
SFTP, acronimo di Secure File Transfer Protocol, è un protocollo separato contenuto all'interno dell'SSH che implementa i comandi dell'FTP eseguiti attraverso una connessione sicura. Tipicamente può sostituire l'FTP senza nessuna modifica in ogni contesto in cui un server FTP è necessario.
Nella maggior parte dei casi, è preferibile utilizzare SFTP al posto di FTP per la sicurezza aggiuntiva che fornisce e l'abilità di utilizzare una connessione SSH. L'FTP è un protocollo insicuro che dovrebbe essere utilizzato solamente in alcuni casi oppure in reti fidate. Ecco perché in questa guida vedremo Come usare SFTP per trasferire file in modo sicuro.
Anche se l'SFTP è integrato in molti client con interfaccia grafica, in questa guida vedremo come usarlo attraverso la riga di comando.
Come connettersi con SFTP
Di default, l'SFTP utilizza il protocollo SSH per autenticarsi e stabilire una connessione sicura. Per questo motivo, è possibile utilizzare gli stessi metodi di autenticazione disponibili anche con l'SSH.
Sebbene sia possibile autenticarsi anche con una password, è fortemente consigliato creare delle chiavi SSH e copiare la chiave pubblica su qualsiasi server a cui vuoi accedere. Questo può aumentare notevolmente la sicurezza e far risparmiare tempo durante l'accesso.
Proprio per il fatto che SFTP utilizza SSH, connettersi ad un server remoto utilizzando l'SFTP è uguale alla connessione con l'SSH, basta cambiare la prima parola chiave:
Se puoi connetterti alla macchina tramite SSH, allora hai completato tutti i requisiti necessari per utilizzare SFTP per gestire i file. Testare l'accesso SSH con il seguente comando:
sftp nome-utente@ip-server-remoto
Quando la connessione sarà stata stabilita, 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 con il seguente comando:
sftp -oPort=custom_port nome-utente@ip-server-remoto
In questo modo potrai collegarti al server remoto con la porta specificata.
Comando di Aiuto di SFTP
Il comando più utile da imparare è help
. Questo ti dà accesso a un riepilogo degli altri comandi SFTP. Puoi richiamarlo digitando una di queste alternative nel prompt:
help
?
Verrà visualizzato un elenco dei comandi disponibili:
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'
. . .
Vedremo nel dettaglio alcuni di questi comandi proseguendo con la guida.
Navigare con SFTP
Possiamo navigare tra i file del sistema remoto usando una serie di comandi che funzionano in modo simile alle loro controparti della shell locale.
Per prima cosa, possiamo scoprire in quale directory ci troviamo attualmente sul sistema remoto. Proprio come viene fatto in una shell locale, possiamo digitare il seguente comando per ottenere la directory corrente:
pwd
Remote working directory: /home/gbfactory
Possiamo visualizzare il contenuto della directory corrente del sistema remoto con un altro comando che risulterà familiare a chi ha già utilizzato la shell:
ls
filetestuale.txt index.html prova.txt nuovacartella
È necessario sottolineare che i comandi disponibili all'interno dell'interfaccia SFTP non corrispondono perfettamente alla sintassi tipica della shell e non hanno lo stesso livello di funzionalità. Tuttavia sono stati aggiunti dei flag opzionali più importanti come -la
o -ls
che consentono di visualizzare più metadati e permessi dei file.
ls -la
drwxr-xr-x 5 gbfactory gbfactory 4096 Jun 13 15:11 .
drwxr-xr-x 3 root root 4096 Jun 13 15:02 ..
-rw------- 1 gbfactory gbfactory 5 Jun 13 15:04 .bash_history
-rw-r--r-- 1 gbfactory gbfactory 220 Jun 13 15:02 .bash_logout
-rw-r--r-- 1 gbfactory gbfactory 3486 Jun 13 15:02 .bashrc
drwx------ 2 gbfactory gbfactory 4096 Jun 13 15:04 .cache
-rw-r--r-- 1 gbfactory gbfactory 675 Jun 13 15:02 .profile
. . .
Per arrivare a un'altra directory, possiamo emettere questo comando:
cd nuovacartella
Ora abbiamo visto come navigare tra i file del sistema remoto, ma cosa facciamo se abbiamo bisogno di accedere ai nostri file in locale? Possiamo indirizzare i comandi verso il file sistema locale aggiungendo una l
prima del comando (iniziale di local).
Tutti i comandi discussi finora hanno la loro controparte locale. Possiamo, come prima cosa, visualizzare la directory di lavoro locale:
lpwd
Local working directory: /Users/gbfactory
Poi è possibile elencare il contenuto della directory in cui ci troviamo sulla macchina locale:
lls
Desktop prova.txt pagina.html
Documenti documento.rtf index.html
Ovviamente possiamo anche cambiare la directory con cui vogliamo interagire sul sistema locale:
lcd Desktop
Trasferire i file con SFTP
Se vogliamo scaricare un file dal nostro host remoto, possiamo farlo usando il comando get
:
get fileremoto
Fetching /home/gbfactory/fileremoto to fileremoto
/home/gbfactory/fileremoto 100% 37KB 36.8KB/s 00:01
Come puoi vedere, di default, il comando get
scarica il file remoto in un file con lo stesso nome sul sistema locale.
Possiamo copiare il file remoto con un nome diverso specificando il nome in questo modo:
get fileRemoto fileLocale
Il comando get
accetta anche alcuni flag di opzione. Ad esempio, possiamo copiare una directory e tutto il suo contenuto indicando che il comando deve essere ricorsivo:
get -r cartellaRemota
Possiamo dire a SFTP di mantenere le corrette autorizzazioni e tempi di accesso utilizzando il flag -P
o -p
in questo modo
get -Pr cartellaRemota
Copiare File Locali sul Server Remoto
Per trasferire dei file locali sul sistema remoto la procedura è identica, ma è si utilizza il comando put
:
put fileLocale
Uploading fileLocale to /home/gbfactory/fileLocale
fileLocale 100% 7607 7.4KB/s 00:00
Gli stessi flag utilizzabili con get
si applicano anche a put
. Quindi per copiare un'intera directory locale, puoi eseguire put -r
:
put -r cartellaLocale
Uno strumento utile da utilizzare durante il download e il caricamento dei file è il comando df
, con cui puoi verificare di avere spazio sufficiente per completare i trasferimenti che ti interessano:
df -h
Size Used Avail (root) %Capacity
19.9GB 1016MB 17.9GB 18.9GB 4%
Tieni presente che non esiste una variazione locale di questo comando, ma possiamo superare questa limitazione inserendo utilizzando il comando !
.
Il comando !
ci porta in una shell locale, dove possiamo eseguire qualsiasi comando disponibile sul nostro computer locale. Possiamo controllare l'utilizzo del disco digitando:
!
e successivamente:
df -h
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 tua sessione SFTP puoi digitare:
exit
Ora dovresti essere nuovamente all'interno del prompt SFTP.
Manipolare i File con SFTP
SFTP ti consente di eseguire svariati lavori con il filesystem. Ad esempio, puoi cambiare il proprietario di un file sul server remoto con il comando:
chown idutente file
Nota come, a differenza del comando di sistema chmod
, il comando SFTP non accetta il nome dell'utente, ma utilizza invece l'id dell'utente. Sfortunatamente, non esiste un modo veloce per conoscere l'id appropriato direttamente dall'interfaccia SFTP.
Come soluzione alternativa, puoi trovare l'id desiderato all'interno del file /etc/passwd
, che associa i nomi utente ai loro ID nella maggior parte degli ambienti Linux:
get /etc/passwd !less passwd
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
. . .
Nota come invece di eseguire il comando !
da solo, è stato inserito come prefisso prima del comando della shell locale. Funziona per eseguire qualsiasi comando disponibile sulla nostra macchina locale e potrebbe essere stato utilizzato anche in precedenza con il comando df
.
L'id dell'utente (UID) sarà nella terza colonna del file, si tenga presente che le colonne sono delineate dai due punti (:
).
Con lo stesso sistema, possiamo anche cambiare il gruppo del proprietario di un file con:
chgrp idgruppo file
Anche in questo caso, non esiste un modo veloce per ottenere l'elenco dei gruppi del sistema remoto e i loro ID. Possiamo risolvere il problema con il seguente comando:
get /etc/group !less group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
. . .
La terza colonna contiene l'ID del gruppo associato al suo nome, contenuto nella prima colonna. Questo è ciò che stiamo cercando.
Il comando chmod
dell'SFTP funziona normalmente anche su un sistema remoto:
chmod 777 filePubblico
Changing mode on /home/gbfactory/filePubblico
Non esiste un comando equivalente per manipolare i permessi dei file locali, ma puoi impostare umask locale, in modo che tutti i file copiati nel sistema locale abbiano i permessi corrispondenti.
Questo può essere fatto con il comando lumask
:
lumask 022
Local umask: 022
Ora tutti i normali file scaricati (finché il flag -p
non viene utilizzato) avranno come permesso 644.
SFTP consente inoltre di creare directory su sistemi sia locali che remoti con lmkdir
e mkdir
rispettivamente.
Il resto dei comandi file ha come target solo il filesystem remoto:
ln rm rmdir
Questi comandi replicano il comportamento principale dei loro equivalenti shell. Se devi eseguire queste azioni sul file system locale, ricorda che puoi entrare in una shell eseguendo questo comando:
!
Oppure esegui un singolo comando sul sistema locale premettendo il comando con !
in questo modo:
!chmod 644 somefile
Al termine della sessione SFTP, si può utilizzare exit
oppure bye
per chiudere la connessione.
bye
Conclusione
Sebbene la sintassi SFTP sia molto meno completa dei moderni strumenti shell, può essere utile per fornire compatibilità con la sintassi FTP legacy o per limitare con attenzione le funzionalità disponibili per gli utenti remoti di alcuni ambienti.
Se sei abituato a utilizzare FTP o SCP per eseguire i tuoi trasferimenti, SFTP è un buon modo per sfruttare i punti di forza di entrambi. Sebbene non sia appropriato per ogni situazione, è uno strumento flessibile da avere nel tuo repertorio.