Skopiuj plik z powrotem do systemu lokalnego za pomocą ssh

257

Jeśli jestem zalogowany do systemu za pośrednictwem SSH, czy istnieje sposób na skopiowanie pliku z powrotem do mojego systemu lokalnego bez uruchamiania innego terminala lub sesji ekranowej i robienia scp lub czegoś podobnego lub bez robienia SSH ze zdalnego systemu z powrotem do system lokalny?

Shawn J. Goff
źródło
4
Jeśli masz serwer ssh na swoim kliencie, zawsze możesz spróbować scp file.foo [email protected]:file.foo: P
rahmu
4
Na pewno, ale nie chcę zezwalać na dostęp do mojego komputera z serwera należącego do firmy, dla której pracuję :) W każdym razie mam tu tylko uwierzytelnianie oparte na kluczach i umieszczenie mojego klucza prywatnego nie byłoby zbyt bezpieczne na serwerze!
Naftuli Kay
2
Nie rozumiem twojego problemu. Wygeneruj nową parę kluczy, skopiuj część publiczną na komputery klucze autoryzowane i po przeniesieniu usuń ponownie tę linię.
Nils
8
Często to robię, więc byłoby to nieefektywne za każdym razem, gdy chcę skopiować plik w trakcie sesji SSH. Po prostu szukam sposobu, aby podczas sesji terminalu SSH połączyć się z komputerem lokalnym i wysłać plik na zdalny serwer bez konieczności opuszczania bieżącej sesji SSH.
Naftuli Kay
2
Problem polega na tym, że początkowe logowanie ssh może być uciążliwe (2fa lub inne wyzwania poza kluczem lub hasłem), możemy nie mieć uprawnień do zmiany konfiguracji serwera ssh, nie ma powodu, aby kilkakrotnie negocjować klucze, i że gdy mamy sesję, byłoby miło wykorzystać tę sesję do wielu rzeczy.
duanev

Odpowiedzi:

139

Połączenie główne

Najłatwiej jest to zaplanować z wyprzedzeniem.

Otwórz połączenie główne za pierwszym razem. W przypadku kolejnych połączeń trasuj połączenia podrzędne przez istniejące połączenie główne. W swoim ~/.ssh/configustaw, aby udostępnianie połączenia odbywało się automatycznie:

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

Jeśli rozpoczniesz sesję ssh do tego samego (użytkownika, portu, komputera) co istniejące połączenie, druga sesja zostanie tunelowana w pierwszej. Nawiązanie drugiego połączenia nie wymaga nowego uwierzytelnienia i jest bardzo szybkie.

Więc mając aktywne połączenie, możesz szybko:

Przekierowanie

W istniejącym połączeniu możesz ustanowić tunel zwrotny ssh. W wierszu polecenia ssh utwórz zdalne przekazywanie, przekazując -R 22042:localhost:22gdzie 22042 to losowo wybrany numer, który różni się od dowolnego innego numeru portu na zdalnej maszynie. Następnie ssh -p 22042 localhostna komputerze zdalnym łączy się z powrotem z maszyną źródłową; możesz użyć scp -P 22042 foo localhost:do skopiowania plików.

Możesz to zautomatyzować za pomocą RemoteForward 22042 localhost:22. Problem polega na tym, że jeśli łączysz się z tym samym komputerem z wieloma instancjami ssh lub jeśli ktoś inny korzysta z portu, nie otrzymujesz przekierowania.

Jeśli nie włączyłeś zdalnego przekazywania od samego początku, możesz to zrobić w istniejącej sesji ssh. Typ Enter ~C Enter -R 22042:localhost:22 Enter. Aby uzyskać więcej informacji, zobacz „Znaki specjalne” w instrukcji.

W tym wątku dotyczącym awarii serwera znajduje się również kilka interesujących informacji .

Kopiuj wklej

Jeśli plik jest mały, możesz go wpisać i skopiować i wkleić z wyjścia terminala. Jeśli plik zawiera znaki niedrukowalne, użyj kodowania takiego jak base64 .

remote.example.net $ base64 <mój_plik
 (skopiuj dane wyjściowe)
local.example.net $ base64 -d> mój plik
 (wklej zawartość schowka)
Ctrl +D

Wygodniej, jeśli masz aktywne przekazywanie X, skopiuj plik na zdalnym komputerze i wklej go lokalnie. Możesz przesyłać dane do i z xcliplub z xsel. Jeśli chcesz zachować nazwę pliku i metadane, skopiuj i wklej archiwum.

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

local.example.net$ xsel | tar -xzf -
Gilles
źródło
Jeśli możemy przesyłać pliki za pomocą SSH, dlaczego ludzie nadal potrzebują / korzystają z SFTP?
Pacerier
3
@Pacerier Ponieważ SFTP to sposób przesyłania plików za pomocą SSH.
Gilles
Dlaczego ludzie potrzebują nawet SFTP, jeśli mogą przesyłać pliki za pomocą SSH-bez-SFTP?
Pacerier
Metoda kopiuj-wklej jest szczególnie wygodna w przypadku połączeń łańcuchowych (tj.
Przeskakiwanie
1
@Pacerier SFTP ma kilka dodatkowych poleceń, takich jak pliki list lub usuwa plik zdalny itp.
rahmu
67

Innym łatwym sposobem (IMO) byłoby:

# 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

Lub jeśli wolisz coś podobnego do GUI, wypróbuj Midnight Commander . Nazywają tę funkcję Shell-Link . Większość dystrybucji ma je w swoich systemach pakietów jako mc.

Florian Fida
źródło
8
Szczerze mówiąc, nie rozumiem, dlaczego nie jest to doceniane. OP poprosił o rozwiązanie bez scp. Czasami, szczególnie jak w moim przypadku, gdy ssh'ing do bardzo kalekiego routera dostarczonego przez ISP, nie mam sftp, nie mam scp, a nawet ftp jest bardzo zepsuty. Wiedziałem, że mogę to zrobić, po prostu przyszedłem tutaj, aby upewnić się, że moja składnia jest poprawna.
Auspex
1
Znakomity! mcjest najszybszy w użyciu.
Namek,
2
Właściwie to rozwiązanie nie działa w moim przypadku. Dzięki tunelowi utworzonemu od systemu Windows do systemu Linux zaczynasz od szpachli, a nie od terminala. Ta metoda jest dokładnie tym, czego chciałem, ale nie mogę jej użyć. Zirytowany.
Benjamin
1
Powodem, dla którego nie popieram tego, jest to, że nie będzie działać, jeśli komputer kliencki znajduje się za współdzielonym routerem (jak sieć korporacyjna). Przypuszczam, że jestem na komputerze roboczym i ssh'd do mojego serwera domowego. Jak skopiować plik na komputer służbowy po przejściu trudnych czynności związanych z przechowywaniem plików przez złożone katalogi ze spacjami i znakami specjalnymi?
Sridhar Sarnobat
1
Działa dobrze z danymi binarnymi. tgzCały czas robię to z plikami :)
Florian Fida
53

SSH obsługuje kilka poleceń za pomocą znaku zmiany znaczenia ( ~domyślnie):

$ ~?
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

!argsWydaje się być najbliżej, co chcesz. Pamiętaj, że musisz PermitLocalCommandwłączyć w swoim /etc/ssh_configpliku, aby ~Cpolecenia działały (zobacz man ssh_config).

Możesz ponownie użyć tej samej sesji ssh, jeśli skonfigurowałeś ControlMasterw ssh_config. Jeśli to zrobisz:

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

technicznie nigdy nie opuściłeś sesji ssh i nie musisz ponownie uwierzytelniać. Prawdopodobnie bardziej skomplikowane, niż byś chciał, ale nie mogę wymyślić innego łatwego sposobu.

Corey Henderson
źródło
Czy to nadal działa? Nie mogłem znaleźć !argsw komunikacie pomocy.
xuhdev
@xuhdev to wciąż istnieje na OpenSSH_7.2p2, argsnie jest w pierwszym komunikacie pomóc ( ~?), ale w drugim (jeden raz wchodzi do ssh>wiersza z ~C, można wpisać helpw ssh>wierszu polecenia)
sdaau
To wygląda na dobre rozwiązanie (chociaż tego nie próbowałem), nie zdawałem sobie sprawy, że możesz uzyskać nadrzędny bufor wiersza poleceń, w stylu vim. W praktyce, ktoś może po prostu woli otworzyć nową kartę terminala, aby nie zapomnieć, jak wrócić do sesji (na przykład, gdy nigdy nie pamiętam, jak wyjść z emacsa).
Sridhar Sarnobat
37

To są bardzo skomplikowane metody.
Możesz zamontować zdalny system plików na komputerze lokalnym za pomocą sshfs:

mkdir -p /mnt/sshfs

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

Następnie możesz skopiować wklej plik za pomocą nautilus, gnome, konqueror, delfin, bash lub cokolwiek innego.

Kłopot
źródło
4
Łączenie z plikiem klucza:sshfs -oIdentityFile=~/.ssh/keyfile.pem [email protected]:/ /mnt/sshfs/
pokaż
15
  • Użyj ssh-xfer , zmodyfikowanego agenta ssh, który skutecznie przeciąża istniejący kanał boczny ssh do przesyłania plików.
  • Użyj zssh , który jest efektywnie zmodem nad ssh. Jeśli kiedykolwiek używałeś rzsz, będzie to wydawać się bardzo znajome.
  • Porty do tyłu ( -R, dla zdalnego na lokalny) lub do przodu ( -L, dla lokalnego na zdalny), aby uruchomić przesyłanie plików, zakładając, że jakiś demon przesyłający pliki nasłuchuje na drugim końcu.

Ale żadne z nich nie jest tak naprawdę potrzebne, IMO. Protokół SSH obsługuje wiele kanałów na jednym połączeniu, a klient OpenSSH obsługuje multipleksowanie. Zakładając, że masz ControlMasteri ControlPath skonfigurowałeś ( ControlPersistjest również przydatny),

  # pierwsze połączenie
$ ssh pilot

  # będzie multipleksować przez to samo połączenie, które otworzył oryginalny ssh
$ sftp remote
efemeryczny
źródło
5
zmodem przypomina mi o pobieraniu najnowszego shareware z lokalnego BBS .. :-)
Stuart Woodward
Sposób xfer jest dokładnie tym, czego szukałem, ale czy wiesz, dlaczego łatka ssh-xfer nie jest zawarta w pakiecie OpenSSH? Trochę ognia?
Ferran Basora,
Dzięki za podpowiedź zssh! Używam tmux w Konsole i z powodu tmux mój "sz" z serwera już nie działa. Zssh rozwiązuje moje problemy!
0xAF
9

Jeszcze prostsze podejście: otwórz Filezilla (lub ulubioną przeglądarkę ftp), otwórz połączenie ssh z tą samą witryną, znajdź plik i przeciągnij go do lokalnej struktury plików. Jeśli dopiero zaczynasz korzystać z Filezilli, skorzystaj z funkcji „Site Manager”, aby szybko połączyć się ponownie następnym razem.

Tak, wiem, że jest to oczywiste dla większości z was (i nie dokładnie w punkcie), ale niektórzy (jak ja), którzy znaleźli ten wątek w poszukiwaniu rozwiązania wyłącznie terminalowego, mogli przeoczyć oczywiste.

Larry Jones
źródło
Tak lub sftp, zgodnie z sugestią tutaj .
atomicules
Wierzę, że serwerem FileZilla jest tylko Windows. Klient jest jednak wieloplatformowy
Freedom_Ben
Możesz nawet użyć Caja, po prostu otwórz ssh://SERVER.
basic6
8

To, co uważam za najlepsze i najbardziej wydajne rozwiązanie, to użycie xclip-copyfilei xclip-pastefile.

Na serwerze możesz xclip-copyfileskopiować jeden lub więcej plików. Te pliki są następnie dostępne na twoim lokalnym serwerze. Tam możesz użyć xclip-pastefile.

Pomija to potrzebę używania scplub posiadania lokalnego serwera ssh. Używam tego na przykład z cygwin. Jedynym problemem jest to, że wymaga to instalacji, xclipjeśli jeszcze go nie masz. Aha, i to działa również z plikami binarnymi.

Robert
źródło
Wow, może to być lepsze rozwiązanie niż moje odwrotne przekierowywanie portów plus netcat.
Sridhar Sarnobat
3

Jednym z wielu powodów, dla których korzystamy z SecureCRT - pomimo tego, że preferujemy oprogramowanie open source tam, gdzie jest to praktyczne - jest łatwość przesyłania plików. Po prostu nie ma bezpośredniej wymiany w świecie F / OSS.

SecureCRT zaczął jako czysty program Windows w połowie lat 90., ale kilka lat temu został przeniesiony do Mac OS X i Linux .

SecureCRT ma trzy główne funkcje przesyłania plików do iz systemu, w którym jesteś SSH:

  • ZModem , YModem , XModem , Kermit i ASCII - SecureCRT to old-schoolowy emulator terminala, obsługujący kilka wewnątrzpasmowych protokołów przesyłania plików.

    Najłatwiejszy w użyciu jest ZModem. Gdy wpiszesz coś sz file-to-downloadw zdalnym wierszu poleceń, szprogram zdalny wypisze sekwencję zmiany znaczenia, która każe SecureCRT natychmiast rozpocząć pobieranie file-to-downloaddo domyślnego katalogu pobierania.

    Miłym akcentem jest to, że katalog pobierania można dostosować dla każdej sesji. Używamy tego, aby mieć katalogi dla poszczególnych witryn na naszym głównym serwerze plików biurowych, więc nie musimy ręcznie sortować pobranych plików.

    ( szto program „send ZModem”, będący częścią lrzszpakietu. Jest już spakowany dla większości systemów Unixy. Jeśli z jakiegoś powodu twój zdalny system jeszcze go nie zainstalował i nie możesz łatwo zainstalować pakietu binarnego, pakiet źródłowy jest mały i bardzo przenośny. lrzsz Niejednokrotnie musiałem wysłać „sharchive” lub uuencode„tarball” do zdartego systemu zdalnego, aby móc do niego pliki ZModem).

  • SFTP - SecureCRT ma ściśle zintegrowaną podstawową implementację SFTP.

    Przez „ściśle zintegrowany” rozumiem, że po podaniu polecenia menu SFTP lub skrótu klawiaturowego otwiera nową kartę połączoną ze zdalną witryną za pośrednictwem tego samego połączenia SSH. Dlatego nie trzeba się ponownie logować, a połączenie jest ustanawiane nieco szybciej niż w przypadku otwarcia osobnego połączenia SFTP z tym samym serwerem.

    Cechę SFTP określam jako „podstawową”, ponieważ VanDyke Software ma osobny produkt do przesyłania plików, SecureFX . Jest bardziej funkcjonalny niż wbudowany klient SFTP, a także integruje się z SecureCRT.

    Funkcja SFTP SecureCRT umożliwia konfigurowanie domyślnych katalogów zdalnych i lokalnych, które są niezależne od konfiguracji ZModem.

    Ta funkcja SFTP ma podstawowy interfejs wiersza poleceń, naśladujący sftpprogram OpenSSH , z tą różnicą, że zapewnia dostęp do Tabpoleceń. Zatem odzyskanie zdalnego pliku o nazwie somefile.tar.gzmoże być tak proste, jak get soTabEnter.

  • Przeciągnij i upuść - przeciągnięcie i upuszczenie pliku do okna terminala powoduje automatyczne rzwpisanie pliku i rozpoczęcie wysyłania pliku.

    Alternatywnie możesz otworzyć kartę SFTP i upuścić plik na tę kartę, aby wysłać go przez SFTP. Zatem wysłanie pliku na zdalnym systemie może być tak proste, jak Alt-P, przeciągnij , upuść .

    Przekonujemy się, że transfery odbywają się o wiele szybciej za pośrednictwem SFTP, prawdopodobnie dlatego, że jest to protokół oparty na TCP, więc korzysta z dużych przesuwanych okien nowoczesnych stosów TCP / IP . ZModem został zaprojektowany w czasach, gdy rozmiar bloku 64 kiB był uważany za „duży”. Tak więc duża część potencjalnej prędkości w łączu jest pochłaniana w ZModem, podczas gdy każdy koniec czeka na potwierdzenia transferu bloku.

    Jedną fajną rzeczą w trybie „przeciągnij i upuść” jest to, że eliminuje stres związany z używaniem ZModem. Podczas pisania rzw systemie zdalnym SecureCRT automatycznie wyświetla próbnik plików. Następnie masz około minuty na znalezienie i wybranie pliku, zanim upłynie limit czasu strony zdalnej. Stwarza to atmosferę wyścigu z czasem, co nie jest przyjemne. Przeciągnij i upuść pozwala znaleźć plik w wolnym czasie, a następnie rozpocząć transfer jednym szybkim ruchem myszy.

    Nadal korzystamy z metody ręcznej, rozpoczynając przesyłanie wyraźnym rzpoleceniem. Wynika to z faktu, że SecureCRT pozwala skonfigurować katalog wysyłania na sesję, który wskazujemy na folder na serwerze plików, który zawsze zawiera najnowszą wersję oprogramowania uruchomionego przez daną zdalną witrynę. W przypadku takich transferów nie ma wyścigu z czasem, ponieważ selektor plików otwiera się w odpowiednim miejscu na początek.

Warren Young
źródło
1

Posługiwać się "!" przekonwertować plik na reprezentację ASCII pliku (np ! uuencode myfile.bin >uuencode.dat.). Następnie użyj ! cat uuencode.dat >target.dat. Następnie użyj kodu uudecode po stronie docelowej:! uudecode target.dat >myfile.bin

Nils
źródło