Scarica un file su una sessione SSH attiva


86

Voglio scaricare un file da una sessione SSH attiva. In molti casi probabilmente potuto basta usare SFTP, scp, rsynced altri ma ci sono momenti in cui mi sono elevati autorizzazioni sul server remoto in un modo che non posso utilizzare questi metodi.

Se stai lottando per capire cosa intendo, immagina di voler scaricare qualcosa da /root/o /var/log/auth.log. L'accesso root è disabilitato (perché non siamo idioti). Come si ottiene quel file? Copiarlo da qualche parte meno protetto e poi spostarlo? Questo è goffo. Ci sono anche scenari in cui il percorso remoto è complesso o temporaneo o non è nemmeno un percorso perché voglio che l'output di un comando remoto sia memorizzato localmente. Conservare in remoto, quindi copiare? Tonfo!

Esistono molti modi più ingombranti per ottenere versioni di questi, ma in un mondo ideale, avrei qualcosa di simile all'accesso locale in scrittura dal server remoto, usando la sessione SSH esistente come canale. Qualcosa del genere (questa è solo l'impressione di un artista):

$oli@remote: cp /root/cheesecake /local/

E appare solo nel mio locale cwd. E l'accesso bidirezionale non sarebbe una brutta cosa.


Sono passati otto lunghi anni da quando ho posto questa domanda e abbiamo visto una vasta gamma di clunk, ma rimane un problema con cui ancora faccio fatica ogni tanto.

Ho riformulato la domanda in qualcosa di molto più idealistico. Capisco perfettamente che al momento potrebbe non esserci una risposta perfetta. Tutti gli sforzi passati e futuri verso il mio ideale sono apprezzati.


1
Domanda interessante! Mostra davvero come le idee delle persone su cosa sia sensato fare vengano modellate dagli strumenti che usano. zsshè probabilmente il più vicino al flusso di lavoro simile a zmodem che potresti ricordare.
poolie il

1
Sono davvero sorpreso che anche dopo 8 risposte, non c'è davvero alcun modo per farlo
endolith

Risposte:


34

Potresti voler dare un'occhiata a zssh , che è disponibile nell'universo e quindi disponibile con

sudo apt-get install zssh

Ne hai bisogno sul tuo server Ubuntu e sul tuo client, ma fondamentalmente quando accedi con zssh, premi semplicemente 'ctrl- @' e si apre la "Modalità di trasferimento file" che ti consente di inviare i file indietro nel tuo pipe al tuo macchina client o caricarli dal client al server.

Tuttavia, non è necessario autorizzare nuovamente o aprire una nuova finestra per scp.

Se stai usando i tasti ssh e un agente ssh, puoi fare abbastanza facilmente:

[enter]~[ctrl]-Z

Quale sarà lo sfondo ssh, e poi solo scp $!:/whatever/whatever .'

Una volta trasferito il file, fgper recuperare ssh.

Se non stai usando le chiavi ssh, puoi comunque usare le opzioni "ControlMaster" e "ControlPath" aggiunte alle recenti versioni di OpenSSh, ma che diventa complicato, controlla man ssh_config


24

Supponendo che tu stia eseguendo un server SSH sul desktop (ci sono modi per aggirare questo, ma penso che tutti aggiungano complessità e possibilmente abbiano problemi di sicurezza), puoi impostare un tunnel SSH inverso. Vedi SSH facilmente copiare il file sul sistema locale. sopra a unix.SE .

  • Digitare Enter ~C Enter -R 22042:localhost:22 Enterper creare un port forwarding inverso dal server al desktop (22042 può essere qualsiasi numero di porta compreso tra 1024 e 65534 non utilizzato).
  • Quindi scp -P 22042 foo localhost:copierà il file foonella directory corrente sul server a casa sul desktop.
  • Ora sposta il file nella directory corrente sul desktop digitando Enter ~ Ctrl+ Z mv ~/foo . Enter fg Enter.

Le sequenze di escape SSH iniziano con ~; la tilde è riconosciuta solo dopo una nuova riga. ~ Ctrl+Zmette ssh sullo sfondo. ~Cinserisce una riga di comando in cui è possibile creare o rimuovere un inoltro.


1
L'uso di 2 livelli di crittografia e compressione è un po 'eccessivo, ecco perché ho suggerito di usare rsh o ftp per il "back link".
JanC

2
@JanC: Ciò richiede una maggiore configurazione: devi installare un server rsh o ftp e assicurarti che la sua configurazione sia sicura. Il sovraccarico della crittografia è minimo anche su un netbook.
Gilles,

Neanche un server ssh è installato di default. ;)
JanC

@ JanC: Un altro vantaggio di ssh è che se hai abilitato l'inoltro dell'agente, non dovrai digitare una password per fare la copia. Efficienza del flusso di lavoro rispetto alla microefficienza informatica.
Gilles,

Ovviamente puoi fare qualcosa del genere anche con (alcuni) altri servizi. In ogni caso, ci sono diverse soluzioni simili che implicano tutte la configurazione di una connessione tunnel indietro e un demone extra ...;)
JanC

10

Ho escogitato un modo per farlo con ssh standard. È uno script che duplica l'attuale connessione ssh, trova la directory di lavoro sul computer remoto e copia il file specificato sul computer locale. Ha bisogno di 2 script molto piccoli (1 remoto, 1 locale) e 2 righe nella tua configurazione ssh. I passi sono come segue:

  1. Aggiungi queste 2 righe al tuo ~/.ssh/config:

    ControlMaster auto
    ControlPath ~/.ssh/socket-%r@%h:%p
    

    Ora se hai una connessione ssh per machineX open, non avrai bisogno di password per aprirne un'altra.

  2. Crea uno script di 1 riga sul computer remoto chiamato ~/.grabCat.sh

    \#!/bin/bash<br>
    cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1
    
  3. Crea uno script sul computer locale chiamato ~ / .grab.sh

    \#!/bin/bash
    [ -n "$3" ] && dir="$3" || dir="."
    ssh "$1" ".grabCat.sh $2" > "$dir/$2"
    
  4. e crea un alias per grab.sh in ( ~/.bashrco ovunque):

    alias grab=~/.grab.sh
    

Ecco fatto. Ora, se hai effettuato l'accesso machineX:/some/directory, accendi un nuovo terminale e digita

grab machineX filename

Ciò inserisce il file nella directory di lavoro corrente sul computer locale. È possibile specificare una posizione diversa come terzo argomento da "catturare".

Nota: ovviamente entrambi gli script devono essere "eseguibili", vale a dire chmod u+x filename.


Interessante, potresti spiegare come funziona? Sei in grado di estenderlo per supportare il "mettere" file e afferrarli?
Peter Gibson,

5

Se la tua macchina client (la macchina su cui ti trovi) si chiama machineA e la macchina in cui sei attualmente SSH si chiama machine B. MachineA, la tua macchina locale deve avere SSHD in esecuzione e la porta 22 aperta. Poi:

scp myfile machineA:

Copia myfilesu MachineB nella mia directory homeA MachineA machineA. Ciò presuppone che userid / password siano uguali.

scp myfile machineA:/newdir/newname

Copia myfileun MachineB /newdir/newnamesul machineA. Ciò presuppone che userid / password siano uguali.

scp MachineA:/path/to/my/otherfile . 

Ottiene una copia otherfiledalla mia directory MachineA su MachineA e la inserisce nella mia directory di lavoro corrente sulla macchina MachineB (designata in modo standard UNIX dal carattere "punto" (.)). Ciò presuppone che userid / password siano uguali.

Se userid / password non sono gli stessi, utilizzare:

scp myfile user@MachineA: per ottenere il file.

scp user@MachineA:/path/to/my/otherfile . per mettere i file

NOTE su SCP:

Proprio come il cpcomando, scpha un'opzione -p per propagare le impostazioni di autorizzazione del file originale sulla copia (altrimenti la copia viene effettuata con le impostazioni normali per i nuovi file) e un'opzione -r per copiare un intero albero di directory con uno comando.

scpcrea un canale di dati crittografato completamente trasparente tra le due macchine, in modo che i dati binari (come immagini o programmi eseguibili) vengano conservati correttamente. Questo significa anche che scpnon è in grado di eseguire la conversione di terminazione di fine linea automatica tra diversi tipi di sistemi operativi, come si può fare con ftp in modalità "ascii". Questo non sarà un problema quando si copia tra sistemi Unix, che usano tutti la stessa convenzione di fine linea.


2

se si accede al server tramite ssh, si ha la possibilità di connettersi anche tramite sftp. Tieni a portata di mano il filezilla client (GUI) e incolla il percorso in cui ti trovi attualmente

inserisci qui la descrizione dell'immagine


2
Ciò trarrebbe beneficio da maggiori dettagli, incluso come connettersi a un server SSH con FileZilla (non è ovvio). Le schermate possono anche aiutare, oltre al testo esplicativo .
Eliah Kagan,

2

Se il tuo file è abbastanza piccolo puoi codificarlo con base64 e quindi decodificarlo localmente:

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

Risposta originale da cui ho ottenuto questo (e testato) da: https://unix.stackexchange.com/a/2869/194134


Cosa c'entra questo con qualcosa? Non è necessario codificare i file per modificarli con scp ecc.
HörmannHH,

1

Non è sulla connessione SSH attiva, ma scp copia i file usando gli stessi meccanismi e le stesse autorizzazioni di ssh.


4
Sono a conoscenza di SCP ma è un flusso di lavoro molto sconnessa. Se sto lavorando in una determinata directory remota, ho bisogno di ottenere il percorso remoto, disconnettermi (o generare un'altra shell), eseguire lo script scrivendo i percorsi e quindi riconnettermi. Sto cercando qualcosa che sia simile alla scrittura get filee che magicamente riappaia sulla mia macchina locale. Se deve farlo tramite un servizio sintonizzato su SSH, così sia. Ma dovrebbe essere associato alla sessione.
Oli

Inoltre è stato sostituito da sftp (vedi la mia risposta)
Olivier Lalonde

@Oli - Poiché entrambe le estremità della transazione sono caselle * nix, probabilmente entrambe sono in sshdesecuzione e quindi dovresti essere in grado di utilizzare scpla riga di comando del server per restituire i file al client. C'è solo tanta magia da aggirare; a volte dobbiamo ancora premere i pulsanti. Anche la soluzione FileZilla è utile.
zerobandwidth,

1

Questo non è possibile con una sessione ssh predefinita, ma è possibile utilizzare uno script anziché ssh, che avvia qualcosa di simile a un semplice server ftp o rsh sul sistema locale ed esegue ssh con le opzioni necessarie per impostare un tunnel sul desktop per la connessione a questo server.


O potrebbe semplicemente scp / rsync ...
HörmannHH,

1

konsole ha questa capacità tramite il menu "Modifica-> Caricamento ZModem" mentre sei in una sessione remota (o Ctrl-Alt-U).

Nota: il pacchetto lrzszdeve essere installato per primo. Per me sembra funzionare solo per il caricamento di file ASCII.


0

Dato che ti stai collegando da un desktop, immagino che tu possa aprire un secondo terminale.

Ecco come faccio spesso:

  • dal primo terminale, quello in cui è in esecuzione la sessione ssh, ottengo il percorso completo del file che devo ottenere, usando uno realpath myfileo readlink -f myfile(versioni precedenti di Ubuntu non preinstallate realpath) e copiarlo.
  • dal secondo terminale che uso scpo sftpper ottenere il file, incollando il percorso completo ottenuto in precedenza. Per esempio:scp user@host:/etc/some/file ./

È abbastanza semplice, ma è anche facile da ricordare e non ha bisogno di alcun pacchetto aggiuntivo per funzionare.

ottenere il percorso completo dal primo terminale, quindi incollare nel secondo terminale


Non aiuta con il problema "si tenta di ottenere un file root e non è possibile accedere direttamente dal root" posto nella domanda.
Oli

0

Sorprendentemente non vedo alcuna menzione del buon vecchio comandante di mezzanotte qui. A mio avviso, è probabilmente il file manager più universale e utile per shell con funzionalità di alimentazione, uno degli strumenti "indispensabili" per il caso, che consente anche di connettersi tramite SSH, FTP, SFTP, mentre è acceso nel secondo pannello puoi aprire qualsiasi altro filesystem (il tuo locale) e quindi lavorare liberamente con i file.

Tutto ciò che serve è: apt-get install mc (dall'universo)

Dopodiché, esegui mc, apri il menu per il pannello sinistro o destro, scegli la connessione shell, inserisci username @ remote-ip, la password - in realtà, è tutto .. copia (qui: scarica) file / cartelle da una macchina all'altra con F5, spostati con F6 e così via in base ai pulsanti seguenti. Per i vecchi utenti MS: proprio come in NC per DOS


-2

MODO pensare troppo, gente. Stavo cercando anche tutte le risposte profonde, oscure e complesse. Si scopre, puoi farlo direttamente da Dolphin direttamente dalla lattina. pesce: // nomeutente @ server: porta


Non capisco
Pierre.Vriens,

Non credo che tu capisca il mio caso d'uso. Sono in una sessione attiva della riga di comando SSH e desidero inviare un file al mio computer locale da una posizione [potenzialmente privilegiata, cioè non disponibile su SFTP]. Potrebbe non essere nemmeno un file alla sua genesi, potrebbe essere l'output del comando. Sto cercando un modo per ricollegarlo senza creare file intermedi e avviare nuove sessioni SFTP / SCP / etc.
Oli
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.