Copia un file nel sistema locale con ssh


257

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 dello schermo e fare scp o qualcosa di simile o senza fare SSH dal sistema remoto al sistema locale?


4
Se hai un server ssh sul tuo client, puoi sempre provare scp file.foo user@myclient.com:file.foo: P
rahmu,

4
Certamente, ma non voglio consentire l'accesso al mio computer da un server di proprietà di un'azienda per cui lavoro :) Ho comunque solo l'autenticazione basata su chiave qui, e non sarebbe troppo sicuro mettere la mia chiave privata sul server!
Naftuli Kay,

2
Non capisco il tuo problema. Genera una nuova coppia di chiavi, copia la parte pubblica sui tuoi computer authorized_keys e dopo il trasferimento elimina nuovamente quella riga.
Nils,

8
Lo faccio molto, quindi sarebbe inefficiente farlo ogni volta che voglio copiare un file nel mezzo di una sessione SSH. Sto solo cercando un modo, durante una sessione terminale SSH, di ricollegarmi al mio computer locale e farlo inviare un file al server remoto senza dover uscire dalla sessione SSH corrente.
Naftuli Kay,

2
Il problema è che il login ssh iniziale può essere una seccatura (2fa o altre sfide oltre la chiave o la password), potremmo non avere i priv per cambiare la configurazione del server ssh, non c'è motivo di dover negoziare le chiavi più volte, e che una volta che avremo una sessione sarebbe bello usare quella sessione per più cose.
duanev,

Risposte:


139

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. Nel tuo ~/.ssh/config, imposta la condivisione della connessione in modo che avvenga automaticamente:

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

Se avvii una sessione ssh sulla stessa (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:

spedizione

Su una connessione esistente, è possibile stabilire un tunnel SSH inverso. Sulla riga comandi ssh, crea un inoltro remoto passando -R 22042:localhost:22dove 22042 è un numero scelto casualmente che è diverso da qualsiasi altro numero di porta sul computer remoto. Quindi ssh -p 22042 localhostsulla macchina remota ti riconnetti alla macchina sorgente; 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. Tipo 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 dentro e fuori di xclipo 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 -

Se possiamo trasferire file usando SSH, perché le persone hanno ancora bisogno / usano SFTP?
Pacerier,

3
@Pacerier Perché SFTP è un modo per trasferire file usando SSH.
Gilles,

Perché le persone hanno persino bisogno di SFTP se possono trasferire file usando SSH-senza-SFTP?
Pacerier,

Il metodo copia-incolla è particolarmente conveniente con connessioni concatenate (ovvero saltando attraverso diversi host per raggiungere quello finale)
golimar

1
@Pacerier SFTP ha alcuni comandi extra come elencare i file o rimuovere un file remoto ecc.
rahmu

67

Un altro modo semplice (IMO) sarebbe:

# to remote host
cat localfile.conf | ssh user@hostname 'cat -> /tmp/remotefile.conf'

# from remote host
ssh user@hostname '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 distro li ha nei loro sistemi di pacchetti come mc.


8
Onestamente, non capisco perché non sia stato votato. OP ha chiesto una soluzione senza scp. A volte, in particolare come nel mio caso in cui mi trovo in un router fornito dall'ISP molto paralizzato, non ho sftp, non ho scp, e anche ftp è gravemente rotto. Sapevo di poterlo fare, sono appena venuto qui per assicurarmi che la mia sintassi fosse corretta.
Auspex,

1
Brillante! mcè il più veloce da usare.
Namek

2
In realtà, questa soluzione non funziona nel mio caso. Con un tunnel creato da Windows a Linux, inizi con Putty, non con un terminale. Questo metodo è esattamente quello che volevo, ma non posso usarlo. Infastidito.
Benjamin,

1
Il motivo per cui non sto eseguendo l'upgrade è perché non funzionerà se il computer client si trova dietro un router condiviso (come una rete aziendale). Suppongo di essere su un computer di lavoro e di averlo inserito nel mio server di casa. Come faccio a copiare un file sul mio computer di lavoro dopo aver affrontato i problemi del cd attraverso directory complesse con spazi e caratteri speciali?
Sridhar Sarnobat,

1
Funziona bene con i dati binari. Lo faccio sempre con i tgzfile :)
Florian Fida il

53

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

L' !argssembra essere più vicino a ciò che si desidera. Nota che dovrai PermitLocalCommandabilitare il tuo /etc/ssh_configfile per ~Cfar funzionare i comandi (vedi man ssh_config).

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

$ ~C
ssh> !scp file user@myserver:

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.


Funziona ancora? Non sono riuscito a trovare !argsnel messaggio di aiuto.
xuhdev,

@xuhdev è ancora lì su OpenSSH_7.2p2, argsnon è nel primo messaggio di aiuto ( ~?), ma nel secondo (una volta che si entra nel ssh>prompt con ~C, si può digitare helpal ssh>prompt)
sdaau,

Sembra una buona soluzione (anche se non l'ho provato), non mi rendevo conto che puoi ottenere un buffer della riga di comando genitore, in stile vim. In pratica, si potrebbe semplicemente preferire aprire una nuova scheda terminale in modo che non dimentichino come tornare alla sessione (come quando non riesco mai a ricordare come uscire da Emacs).
Sridhar Sarnobat,

37

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

mkdir -p /mnt/sshfs

root@IS1300:~# sshfs 192.168.1.2:/ /mnt/sshfs
root@IS1300:~# umount /mnt/sshfs

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


4
Connessione con un file-chiave:sshfs -oIdentityFile=~/.ssh/keyfile.pem user@192.168.1.2:/ /mnt/sshfs/
sshow

15
  • 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.
  • Porte inverse ( -R, da remoto a locale) o avanti ( -L, da locale a remoto) per eseguire i trasferimenti di file, supponendo di avere un demone di trasferimento file in ascolto sull'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 ControlMastere ControlPath impostare ( ControlPersistè utile anche),

  # prima connessione
$ ssh remote

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

5
zmodem mi ricorda il download dell'ultimo shareware dal BBS locale .. :-)
Stuart Woodward

Il modo xfer è esattamente quello che stavo cercando, ma sai perché la patch ssh-xfer non è inclusa nell'upstream OpenSSH? Qualche fiamma?
Ferran Basora,

Grazie per il suggerimento zssh! Sto usando tmux in Konsole e a causa di tmux il mio "sz" dal server non funziona più. Lo zssh risolve i miei problemi!
0xAF

9

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 terminale potrebbero aver trascurato l'ovvio.



Credo che il server FileZilla sia solo Windows. Il client è multipiattaforma
Freedom_Ben

Potresti persino usare Caja, appena aperto ssh://SERVER.
basic6

8

Quello che ho trovato essere la soluzione migliore ed efficiente è usare xclip-copyfilee xclip-pastefile.

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

Questo elude la necessità di utilizzare scpo disporre di un server SSH locale. Lo uso ad esempio con Cygwin. L'unico problema è che questo richiede l'installazione xclipse non l'hai già. Oh, e questo funziona anche con i file binari.


Wow, questa potrebbe essere una soluzione migliore del mio port forwarding inverso più netcat.
Sridhar Sarnobat,

3

Uno dei tanti motivi per cui utilizziamo 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 un 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 di file in banda.

    Il più semplice da usare è ZModem. Quando si digita qualcosa di simile sz file-to-downloadsulla riga di comando remota, il szprogramma remoto scrive una sequenza di escape che dice a SecureCRT di iniziare immediatamente file-to-downloadil 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 lrzszpacchetto. È già impacchettato per la maggior parte dei sistemi Unixy. Se per qualche ragione il tuo sistema remoto non lo ha già installato e non puoi installare facilmente un pacchetto binario, il il pacchetto sorgente è piccolo e altamente portatile. Più di una volta, ho dovuto inviare un lrzsz "sharchive" o uuencode"tarball" a un sistema remoto ridotto in modo da poterlo caricare con 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, che imita il sftpprogramma OpenSSH , tranne per il fatto che ha vantaggi come il Tabcompletamento del comando. Pertanto, recuperare un file remoto chiamato somefile.tar.gzpotrebbe essere facile come get soTabEnter.

  • Trascinamento della selezione : se si trascina la selezione di un file nella finestra del terminale, questo digita automaticamente rzper 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. Così, l'invio di un file a un sistema remoto potrebbe essere semplice come Alt-P, trascinare , goccia .

    Scopriamo che i trasferimenti avvengono molto più velocemente tramite SFTP, probabilmente perché è un protocollo basato su TCP, quindi beneficia delle ampie 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à operativa drag-and-drop è che elimina l'utilizzo di ZModem. Quando si digita rzsul sistema remoto, SecureCRT apre automaticamente un selettore di 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 rzcomando esplicito . 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 esiste alcuna corsa contro il tempo, poiché il selettore di file si apre nel punto corretto per cominciare.


1

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.