it-swarm.it

Copia un file nel sistema locale con ssh

Se ho effettuato l'accesso a un sistema tramite SSH, c'è un modo per copiare un file sul mio sistema locale senza avviare un altro terminale o sessione schermo e fare scp o qualcosa di simile o senza fare SSH dal sistema remoto al sistema locale?

271
Shawn J. Goff

Connessione principale

È più semplice se pianifichi in anticipo.

Aprire una connessione principale la prima volta. Per le connessioni successive, instradare le connessioni slave attraverso la connessione master esistente. Nella tua ~/.ssh/config , imposta la condivisione della connessione in modo che avvenga automaticamente:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Se si avvia una sessione ssh sullo stesso (utente, porta, macchina) di una connessione esistente, la seconda sessione verrà incanalata sulla prima. Stabilire la seconda connessione non richiede alcuna nuova autenticazione ed è molto veloce.

Quindi, mentre hai la tua connessione attiva, puoi rapidamente:

Inoltro

Su una connessione esistente, è possibile stabilire un tunnel SSH inverso. Sulla riga comandi ssh, crea un inoltro remoto passando -R 22042:localhost:22 dove 22042 è un numero scelto in modo casuale diverso da qualsiasi altro numero di porta sulla macchina remota. Poi ssh -p 22042 localhost sul computer remoto ti ricollega al computer di origine; Puoi usare scp -P 22042 foo localhost: per copiare i file.

Puoi automatizzarlo ulteriormente con RemoteForward 22042 localhost:22. Il problema è che se ti connetti allo stesso computer con più istanze di ssh o se qualcun altro sta usando la porta, non ottieni l'inoltro.

Se non hai abilitato un inoltro remoto dall'inizio, puoi farlo su una sessione ssh esistente. genere Enter ~C Enter -R 22042:localhost:22 Enter. Vedere "Escape character" nel manuale per ulteriori informazioni.

Ci sono anche alcune informazioni interessanti in questo thread di errore del server .

Copia incolla

Se il file è piccolo, è possibile digitarlo e incollarlo dall'output del terminale. Se il file contiene caratteri non stampabili, utilizzare una codifica come base64 .

 remote.example.net $ base64 <myfile 
  (copia l'output) 
 local.example.net $ base64 -d> myfile 
  (incolla il contenuto degli appunti) Ctrl+D

Più comodamente, se hai X forwarding attivo, copia il file sul computer remoto e incollalo localmente. È possibile reindirizzare i dati in entrata e in uscita da xclip o xsel . Se vuoi conservare il nome del file e i metadati, copia e incolla un archivio.

remote.example.net$ tar -czf - myfile | xsel
local.example.net$ xsel | tar -xzf -

Un altro modo semplice (IMO) sarebbe:

# to remote Host
cat localfile.conf | ssh [email protected] 'cat -> /tmp/remotefile.conf'

# from remote Host
ssh [email protected] 'cat /tmp/remotefile.conf' > /tmp/localfile.conf

O se preferisci qualcosa di simile alla GUI, prova Midnight Commander . Chiamano la funzione Shell-Link. La maggior parte delle distribuzioni ha em nei loro sistemi di pacchetti come mc.

75
Florian Fida

SSH supporta alcuni comandi, tramite il carattere escape (~ per impostazione predefinita):

$ ~?
Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

$ ~C
ssh> help
Commands:
      -L[bind_address:]port:Host:hostport    Request local forward
      -R[bind_address:]port:Host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KR[bind_address:]port                 Cancel remote forward
      !args                                  Execute local command

Il !args sembra essere il più vicino a quello che vuoi. Tieni presente che devi abilitare PermitLocalCommand nel tuo /etc/ssh_config file per ~C comandi per funzionare (vedi man ssh_config).

Puoi riutilizzare la stessa sessione ssh se hai impostato un ControlMaster in ssh_config. Se lo fai:

$ ~C
ssh> !scp file [email protected]:

tecnicamente non hai mai lasciato la sessione SSH e non devi eseguire nuovamente l'autenticazione. Probabilmente più complicato di quanto vorresti, ma non riesco a pensare a un altro modo semplice.

54
Corey Henderson

Questi sono tutti metodi molto complicati.
Puoi montare il file system remoto sul tuo computer locale con sshfs:

mkdir -p /mnt/sshfs

[email protected]:~# sshfs 192.168.1.2:/ /mnt/sshfs
[email protected]:~# umount /mnt/sshfs

Quindi puoi copiare incollare il file con nautilus, gnome, konqueror, dolphin, bash o altro.

38
Quandary
  • Usa ssh-xfer , un agente ssh modificato che sovraccarica efficacemente un canale laterale ssh esistente per l'uso del trasferimento di file.
  • Usa zssh , che è effettivamente zmodem su ssh. Se hai mai usato rzsz, questo ti sembrerà molto familiare.
  • Inversione (-R, da remoto a locale) o avanti (-L, per le porte da locale a remoto) su cui eseguire i trasferimenti di file, supponendo che tu abbia un demone di trasferimento di file in ascolto all'altra estremità.

Ma nessuno di questi è davvero necessario, IMO. Il protocollo SSH supporta più canali su una singola connessione e il client OpenSSH supporta il multiplexing. Supponendo di avere ControlMaster e ControlPathimpostato (ControlPersist è utile anche),

# prima connessione
 $ ssh remote 
 
 # eseguirà il multiplexing sulla stessa connessione aperta da ssh originale
 $ sftp remote 
15
ephemient

Un approccio ancora più semplice: apri Filezilla (o il tuo browser ftp preferito), apri una connessione ssh allo stesso sito, trova il file e trascinalo nella struttura del file locale. Se non conosci Filezilla, utilizza la funzione "site manager" per riconnetterti rapidamente la prossima volta.

Sì, so che questo è ovvio per la maggior parte di voi (e non proprio sul punto), ma alcuni (come me) che hanno trovato questo thread alla ricerca di una soluzione solo per terminale potrebbero aver trascurato l'ovvio.

9
Larry Jones

Quello che ho trovato essere la soluzione migliore ed più efficiente è usare xclip-copyfile e xclip-pastefile.

Sul server, si utilizza xclip-copyfile per copiare uno o più file. Questi file sono quindi disponibili sul tuo server locale. Qui puoi usare xclip-pastefile.

Questo elude la necessità di usare scp o di avere un server ssh locale. Lo uso ad esempio con Cygwin. L'unico problema è che questo richiede l'installazione di xclip se non lo hai già. Oh, e questo funziona anche con i file binari.

8
Robert

Uno dei tanti motivi per cui usiamo SecureCRT - nonostante preferiamo software open source laddove pratico - è la facilità di trasferire file. Semplicemente non esiste una sostituzione diretta nel mondo F/OSS.

SecureCRT è iniziato come un puro programma Windows a metà degli anni '90, ma è stato portato su Mac OS X e Linux n paio di anni fa .

SecureCRT ha tre caratteristiche principali per il trasferimento di file da e verso un sistema in cui sei SSH:

  • ZModem , YModem , XModem , Kermit e ASCII - SecureCRT è una sorta di emulatore di terminale di vecchia scuola, che supporta diversi protocolli di trasferimento file in banda.

    Il più semplice da usare è ZModem. Quando digiti qualcosa come sz file-to-download sulla riga di comando remota, il programma remoto sz scrive un sequenza di escape che dice a SecureCRT di iniziare immediatamente a scaricare file-to-download nella directory di download predefinita.

    Un bel tocco è che la directory di download è personalizzabile per sessione. Usiamo questo per avere directory per sito sul nostro file server dell'ufficio principale, quindi non dobbiamo ordinare manualmente i file scaricati.

    (sz è il programma "invia ZModem", parte del pacchetto lrzsz . È già impacchettato per la maggior parte dei sistemi Unixy. Se per qualche motivo il tuo sistema remoto non lo fa non è già installato e non è possibile installare facilmente un pacchetto binario, il pacchetto sorgente è piccolo e altamente portatile. Più di una volta, ho dovuto inviare un lrzsz"sharchive " o uuencode 'd tarball a un sistema remoto rimosso in modo da poter aggiungere i file ZModem.)

  • [~ # ~] sftp [~ # ~] - SecureCRT ha un'implementazione SFTP di base strettamente integrata.

    Per "strettamente integrato" intendo che quando si dà il comando di menu SFTP o la scorciatoia da tastiera, si apre una nuova scheda collegata al sito remoto sulla stessa connessione SSH. Pertanto, non è necessario eseguire nuovamente l'accesso e la connessione viene stabilita un po 'più velocemente rispetto a se si fosse aperta una connessione SFTP separata allo stesso server.

    Caratterizzo la funzione SFTP come "di base" perché VanDyke Software ha un prodotto di trasferimento file separato, SecureFX . È più ricco di funzionalità rispetto al client SFTP integrato e si integra anche con SecureCRT.

    La funzione SFTP di SecureCRT consente di configurare directory remote e locali predefinite separate dalla configurazione di ZModem.

    Questa funzione SFTP ha una sorta di interfaccia a riga di comando di base, imitando il programma sftp di OpenSSH, tranne per il fatto che ha vantaggi come Tab completamento del comando. Pertanto, recuperando un file remoto chiamato somefile.tar.gz potrebbe essere facile come get soTabEnter.

  • Drag-and-drop - Se si trascina e rilascia un file sulla finestra del terminale, digita automaticamente rz per te e inizia a inviare il file.

    In alternativa, puoi aprire una scheda SFTP e rilasciare un file su quella scheda per inviarlo tramite SFTP. Pertanto, inviare un file a un sistema remoto potrebbe essere semplice come Alt-P, trascina, rilascia.

    Scopriamo che i trasferimenti avvengono molto più velocemente tramite SFTP, probabilmente perché è un protocollo basato su TCP, quindi trae vantaggio dai grandi finestre scorrevoli dei moderni stack TCP/IP . ZModem è stato progettato ai tempi in cui una dimensione del blocco di 64 kiB era considerata "grande". Pertanto, gran parte della velocità potenziale in un collegamento viene assorbita in ZModem mentre ciascuna estremità attende i riconoscimenti del trasferimento a blocchi.

    Una cosa bella della modalità di funzionamento drag-and-drop è che elimina uno degli stress derivanti dall'uso di ZModem. Quando si digita rz sul sistema remoto, SecureCRT visualizza automaticamente un selettore file. Hai quindi circa un minuto per trovare e selezionare il file prima del timeout del lato remoto. Questo crea un'atmosfera da gara contro il tempo che non è piacevole. Il trascinamento della selezione ti consente di trovare il file a tuo piacimento, quindi avviare il trasferimento con un singolo movimento rapido del mouse.

    Usiamo ancora il metodo manuale, avviando il trasferimento con un comando esplicito rz. Questo perché SecureCRT consente di configurare una directory di caricamento per sessione, che puntiamo alla cartella sul file server che contiene sempre l'ultima build del software in esecuzione su quel particolare sito remoto. Per tali trasferimenti, non vi è alcuna corsa contro il tempo, poiché il selettore di file si apre nel punto corretto per iniziare.

3
Warren Young

Uso "!" per convertire il file in una rappresentazione ASCII del tuo file (ad esempio ! uuencode myfile.bin >uuencode.dat). Quindi usa ! cat uuencode.dat >target.dat. Dopodiché usa uudecode sul lato target: ! uudecode target.dat >myfile.bin

1
Nils