mercoledì 20 luglio 2011

ssh, netcat e tar: trasferire file remoti

Oggi mi sono imbattuto nella necessità di dover trasferire dei file da un server remoto accessibile via ssh a un server interno privato non accessibile dall’esterno. Normalmente per fare questo trasferimento si sarebbe dovuto procedere nel seguente modo:
  • accedere al server esterno in ssh
  • creare un archivio compattato dei files da trasferire
  • disconnettersi dal server
  • trasferire l’archivio con scp dal server interno
  • ricollegarsi al server per eliminare l’archivio
  • disconnettersi nuovamente dal server
  • scompattare l’archivio
immaginate se tutto questo dovesse essere fatto per più cartelle e/o per più server?
Mi son chiesto, allora, se fosse possibile agire con un metodo più snello ed elegante, utilizzando ssh, netcat e tar. Rovistando tra le pagine di manuale di ssh ho trovato l’opzione -R che è praticamente inversa a -L (per chi non la conoscesse può leggere qualcosa a riguardo in “Piccoli trucchi con SSH”). Con l'utilizzo di questa opzione di ssh i passi da compiere sono i seguenti:
  • collegarsi dal server interno con ssh e l’opzione -R al server esterno.
    questo ci permette di aprire una porta sul server remoto che viene inoltrata sul nostro server interno attraverso il collegamento ssh.
  • aprire un altro terminale sul server interno e posizionarsi nella cartella dove dovranno essere copiati i file del server remoto
  • mettere in ascolto netcat su una porta e reindirizzare l’output al comando tar che si occuperà di dearchiviare il flusso di dati che riceverà in input
  • tornare nel terminale con il collegamento ssh al server remoto e posizionarsi nella cartella dove ci sono i file da copiare
  • fare un archivio tar sullo standard output da reindirizzare sulla porta aperta con l’opzione -R di ssh tramite netcat
  • disconnettersi dal server remoto 
Probabilmente un esempio pratico vale più di mille parole (almeno lo è per me).

Problema:
copiare la cartella /var/www di mioserver.com nella cartella backup_server nella mia home directory miodesktop.lan in ufficio.

Soluzione:
  • aprire una finestra di terminale
  • digitare il comando ssh per aprire una porta sul server
    ssh -R 5555:miodesktop.lan:9999 root@mioserver.com
    questo apre la porta 127.0.0.1:5555 su mioserver.com e inoltra tutto il traffico indirizzato a questa porta sulla porta 9999 di miodesktop.lan
  • posizionarsi nella directory /var/www di mioserver.com
  • aprire un altro terminale e posizionarsi nella cartella backup_server nella home
  • mettere in ascolto netcat sulla porta 9999 e inoltrare il traffico al comando tar
    nc -l 9999 | tar zxvf -
    in questo modo netcat sarà in ascolto sulla porta 9999 e il suo output verrà preso in input dal comando tar che provvederà a decomprimere il flusso di dati dell’archivio
  • tornare nel terminale con il collegamento al server e fare l’archivio dei file da copiare inoltrando l’output su netcat collegato alla porta 127.0.0.1:5555
    tar zcvf - * | nc 127.0.0.1 5555
    in questo modo l’archivio diventerà un flusso dati che verrà inoltrato alla porta 5555 da netcat. Questa porta è automaticamente inoltrata alla porta 9999 del desktop tramite l’opzione -R di ssh. Sulla porta 9999 del desktop c’è in ascolto netcat che prende il flusso dei dati e lo “porge” al comando tar che lo elabora.
Spero che questo procedimento possa essere utile a qualcuno. Nel caso ci fosse qualcosa di poco chiaro non esitate a scrivere.

Articoli correlati

Nessun commento:

Posta un commento