Vraag Download een bestand via een actieve SSH-sessie


Dus ik sta SSHed in mijn Ubuntu-server vanaf mijn Ubuntu-desktop. Ik sta op een bepaald pad en ik wil een bestand downloaden naar mijn lokale bestandssysteem (bij voorkeur het pad dat ik was voordat ik de SSH-sessie binnenging).

Ik zou SSH kunnen koppelen en het bestand met de muis kunnen overbrengen, maar wat als ik een root-bestand probeerde te krijgen en mij rechtstreeks via root zou aanmelden, is niet toegestaan? Zelfs als dat niet het geval was (het is nu niet), zeker er moet een eenvoudige manier zijn om een ​​bestand terug te trekken over een actieve SSH-verbinding.

Zeker!


83
2017-11-15 14:59


oorsprong


Interessante vraag! Het laat echt zien hoe de ideeën van mensen over wat verstandig is om te doen, gevormd worden door de hulpmiddelen die ze gebruiken. zssh komt waarschijnlijk het dichtst in de buurt van de zmodem-achtige workflow die je misschien herinnert. - poolie
Ik ben echt verrast dat zelfs na 8 antwoorden er echt geen manier is om dit te doen - endolith


antwoorden:


Misschien wilt u uitchecken zssh, die beschikbaar is in het universum en daarom beschikbaar is bij

sudo apt-get install zssh

Je hebt het nodig op je ubuntu-server en op je client, maar als je bent ingelogd met zssh, druk je gewoon op 'ctrl- @' en komt de 'File transfer-modus' tevoorschijn, waarmee je bestanden terug de pijp naar je kunt sturen clientcomputer of upload ze van client naar server.

U hoeft echter niet opnieuw een sck-account opnieuw te openen of een nieuw venster te openen.

Als je ssh-sleutels en een ssh-agent gebruikt, kun je dat vrij gemakkelijk doen:

[enter]~[ctrl]-Z

Welke achtergrond ssh zal zijn, en dan gewoon scp $!:/whatever/whatever .'

Zodra het bestand is overgedragen, fg om ssh terug te krijgen.

Als u geen ssh-sleutels gebruikt, kunt u nog steeds de opties "ControlMaster" en "ControlPath" gebruiken die zijn toegevoegd aan recente OpenSSh-versies, maar dat wordt lastig, controleer man ssh_config


32
2017-11-17 00:46





Ervan uitgaande dat je een ssh-server op je bureaublad draait (er zijn manieren om dit te doen, maar ik denk dat ze allemaal complexiteit toevoegen en mogelijk beveiligingsproblemen hebben), kun je een reverse ssh-tunnel opzetten. Zien SSH kopieert eenvoudig bestanden naar lokaal systeem. om unix.SE.

  • Type invoeren  ~C  invoeren  -R 22042:localhost:22  invoeren om een ​​reverse port forwarding van uw server naar uw bureaublad te maken (22042 kan elk poortnummer tussen 1024 en 65534 zijn dat niet wordt gebruikt).
  • Dan scp -P 22042 foo localhost: zal het bestand kopiëren foo in uw huidige map op de server bij u thuis op het bureaublad.
  • Verplaats het bestand nu naar uw huidige map op het bureaublad door te typen invoeren  ~  Ctrl+Z  mv ~/foo .  invoeren  fg  invoeren.

Ssh escape-sequences begin met ~; de tilde wordt pas herkend na een nieuwe regel. ~ Ctrl+Z zet ssh op de achtergrond. ~C voert een opdrachtregel in waar u een doorstuur kunt maken of verwijderen.


24
2017-11-15 22:37



Het gebruik van 2 lagen codering en compressie is een beetje overdreven, daarom stelde ik voor om rsh of ftp te gebruiken voor de "backlink". - JanC
@JanC: dat vereist meer setup: je moet een rsh- of ftp-server installeren en ervoor zorgen dat de configuratie veilig is. De overhead van encryptie is minimaal, zelfs op een netbook. - Gilles
Een ssh-server is ook niet standaard geïnstalleerd. ;) - JanC
@JanC: Een ander voordeel van ssh is dat als je het doorsturen van agents hebt ingeschakeld, je geen wachtwoord hoeft te typen om de kopie te doen. Werkstroomefficiëntie over het berekenen van micro-efficiëntie. - Gilles
Je kunt natuurlijk ook iets doen met (sommige) andere diensten. In ieder geval zijn er meerdere vergelijkbare oplossingen die allemaal betrekking hebben op het terugzetten van een tunnelverbinding en een extra daemon ...;) - JanC


Ik kwam met een manier om dit met standaard ssh te doen. Het is een script dat de huidige SSH-verbinding dupliceert, uw werkdirectory op het externe apparaat vindt en het door u opgegeven bestand terugkopieert naar de lokale computer. Het heeft 2 zeer kleine scripts nodig (1 remote, 1 local) en 2 lines in je ssh config. De stappen zijn als volgt:

  1. Voeg deze 2 regels toe aan uw ~/.ssh/config:

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

    Als je een ssh-verbinding met machineX hebt geopend, heb je deze niet nodig wachtwoorden om een ​​andere te openen.

  2. Maak een script met 1 regel op de externe machine met de naam ~/.grabCat.sh

    \#!/bin/bash<br>
    cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1
    
  3. Maak een script op de lokale machine met de naam ~ / .grab.sh

    \#!/bin/bash
    [ -n "$3" ] && dir="$3" || dir="."
    ssh "$1" ".grabCat.sh $2" > "$dir/$2"
    
  4. en maak een alias voor grab.sh in (~/.bashrcof waar dan ook):

    alias grab=~/.grab.sh
    

Dat is alles. Nu als je bent ingelogd op machineX:/some/directory, start gewoon een nieuwe terminal op en typ

grab machineX filename

Dat plaatst het bestand in uw huidige werkdirectory op de lokale computer. Je kunt een andere locatie opgeven als een derde argument om te "pakken".

Opmerking: uiteraard moeten beide scripts "uitvoerbaar" zijn, dat wil zeggen chmod u+x filename.


10
2017-11-30 10:29



Interessant, kun je uitleggen hoe dit werkt? Kun je dit uitbreiden om zowel "putting" -bestanden te ondersteunen als ze te grijpen? - Peter Gibson


Als uw clientcomputer (de machine waar u op zit) machineA heet en de machine waar u momenteel SSH'ed in heet machine B heet. MachineA, moet uw lokale machine SSHD hebben uitgevoerd en poort 22 geopend. Dan:

scp myfile machineA:

kopieën myfile op MachineB naar mijn MachineA home directory op machineA. Dit veronderstelt dat userid / wachtwoord hetzelfde is.

scp myfile machineA:/newdir/newname

kopieën myfile een MachineB naar /newdir/newname op machineA. Dit veronderstelt dat userid / wachtwoord hetzelfde is.

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

Krijgt een kopie van otherfile uit mijn MachineA-directory op MachineA en zet deze in mijn huidige werkdirectory op de MachineB-machine (aangeduid in standaard UNIX-mode door het "punt" (.) -teken). Dit veronderstelt dat userid / wachtwoord hetzelfde is.

Als de gebruikersnaam / het wachtwoord niet hetzelfde zijn, gebruik dan:

scp myfile user@MachineA:  om een ​​bestand te krijgen.

scp user@MachineA:/path/to/my/otherfile .  om bestanden te plaatsen

OPMERKINGEN over SCP:

Net als de cp opdracht, scp heeft een optie -p om de machtigingsinstellingen van het originele bestand naar de kopie te verspreiden (anders wordt de kopie gemaakt met de normale instellingen voor nieuwe bestanden), en een optie -r om een ​​volledige mappenboom met één opdracht te kopiëren.

scp creëert een volledig transparant gecodeerd gegevenskanaal tussen de twee machines, zodat binaire gegevens (zoals afbeeldingen of uitvoerbare programma's) correct worden bewaard. Dit betekent ook dat scp kan geen automatische end-of-line-terminatieconversie uitvoeren tussen verschillende typen besturingssystemen, zoals met ftp in de "ascii" -modus kan worden gedaan. Dat zal geen probleem zijn bij het kopiëren tussen Unix-systemen, die allemaal gebruikmaken van dezelfde end-of-line-conventie.


5
2017-12-07 19:39





als je via ssh toegang tot de server hebt, krijg je ook de mogelijkheid om via sftp verbinding te maken. Houd de filezilla-client (GUI) bij de hand en plak het pad waar je op dat moment aan toe bent

enter image description here


2
2017-11-16 01:12



Dit zou baat hebben bij meer detail, inclusief hoe je verbinding kunt maken met een SSH-server met FileZilla (het is niet vanzelfsprekend). Screenshots kunnen ook helpen, naast verklarende tekst. - Eliah Kagan


Het is niet voorbij de actieve SSH-verbinding, maar scp kopieert bestanden met dezelfde mechanismen en rechten als ssh.


1
2017-11-15 16:11



Ik ben op de hoogte van SCP, maar het is een zeer onsamenhangende workflow. Als ik in een bepaalde externe directory werk, moet ik het pad op afstand zoeken, de verbinding verbreken (of een andere shell laten spawnen), de scping uitschrijven en de paden opnieuw verbinden. Ik ben op zoek naar iets dat lijkt op schrijven get file en het verschijnt magisch terug op mijn lokale machine. Als het dat moet doen via een dienst die gebombardeerd is via SSH, het zij zo .. Maar het moet sessie-gebonden zijn. - Oli♦
Plus het werd vervangen door sftp (zie mijn antwoord) - Olivier Lalonde
@ Oli - Omdat beide einden van de transactie * nix-boxen zijn, hebben ze waarschijnlijk beide sshd rennen en dus zou je moeten kunnen gebruiken scp op de opdrachtregel van de server om bestanden terug te sturen naar de client. Er is alleen zoveel magie om rond te gaan; soms moeten we nog steeds op de knoppen drukken. De FileZilla-oplossing is ook handig. - zerobandwidth


Dit is niet mogelijk met een standaard SSH-sessie, maar je zou een script kunnen gebruiken in plaats van SSH, dat zoiets als een eenvoudige ftp- of rsh-server op je lokale systeem start en ssh uitvoert met de nodige opties om een ​​tunnel terug naar je bureaublad in te stellen om verbinding te maken met deze server.


1
2017-11-15 17:45





konsole heeft die mogelijkheid via "Bewerken-> ZModem Uploaden" -menu terwijl je in een externe sessie bent (of Ctrl-Alt-U).

Let op: pakket lrzsz moet eerst worden geïnstalleerd. Voor mij lijkt het erop dat het alleen werkt voor het uploaden van ASCII-bestanden.


1
2017-09-13 20:58





Als uw bestand klein genoeg is, kunt u het coderen met base64 en het dan lokaal decoderen:

remote.example.net $ base64 <mijnbestand
(kopieer de output)
local.example.net $ base64 -d> mijnbestand
(kopieer de output)
Ctrl+D

Origineel antwoord waar ik dit vandaan kreeg (en uitgetest) van: https://unix.stackexchange.com/a/2869/194134


1
2018-01-20 19:17