Pobierz plik przez aktywną sesję SSH

86

Chcę pobrać plik z aktywnej sesji SSH. W wielu przypadkach pewnie mógłby po prostu użyć SFTP, scp, rsyncet al, ale są chwile, gdzie mam podwyższone uprawnienia na zdalnym serwerze w taki sposób, że nie mogą korzystać z tych metod.

Jeśli próbujesz zrozumieć, co mam na myśli, wyobraź sobie, że chcesz pobrać coś z /root/lub /var/log/auth.log. Logowanie root jest wyłączone (ponieważ nie jesteśmy idiotami). Jak zdobyć ten plik? Skopiować go w mniej chronione miejsce, a następnie przenieść? To jest niezgrabne. Istnieją również scenariusze, w których zdalna ścieżka jest złożona lub tymczasowa lub nawet nie jest ścieżką, ponieważ chcę, aby dane wyjściowe polecenia zdalnego były przechowywane lokalnie. Przechowywać zdalnie, a następnie skopiować? Clunk!

Istnieje kilka innych niezgrabnych sposobów na uzyskanie tych wersji, ale w idealnym świecie miałbym coś podobnego do lokalnego dostępu do zapisu ze zdalnego serwera, wykorzystując istniejącą sesję SSH jako kanał. Coś w stylu (to tylko wrażenie artysty):

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

I po prostu pojawia się w mojej lokalnej cwd. A dwukierunkowy dostęp nie byłby złą rzeczą.


Minęło osiem długich lat, odkąd zadałem to pytanie, i widzieliśmy prawdziwy zakres brzękania, ale pozostaje to problem, z którym wciąż mam problemy.

Przekształciłem pytanie w coś o wiele bardziej idealistycznego. W pełni rozumiem, że obecnie może nie być idealnej odpowiedzi. Doceniamy wszystkie przeszłe i przyszłe wysiłki na rzecz mojego ideału.

Oli
źródło
1
Interesujące pytanie! To naprawdę pokazuje, w jaki sposób ludzkie wyobrażenia o tym, co rozsądne robić, kształtują się za pomocą narzędzi, których używają. zsshjest prawdopodobnie najbliższy przepływowi pracy przypominającemu zmodem, który pamiętasz.
poolie
1
Jestem naprawdę zaskoczony, że nawet po 8 odpowiedziach nie ma na to sposobu
endolith

Odpowiedzi:

34

Możesz wypróbować zssh , który jest dostępny we wszechświecie, a zatem dostępny z

sudo apt-get install zssh

Potrzebujesz go na swoim serwerze Ubuntu i na kliencie, ale w zasadzie po zalogowaniu się z zssh, po prostu naciskasz „ctrl- @” i uruchamia się „Tryb przesyłania plików”, który pozwala ci przesyłać pliki z powrotem do twojego potoku komputer kliencki lub prześlij je z klienta na serwer.

Nie musisz jednak ponownie uwierzytelniać ani otwierać nowego okna do scp.

Jeśli używasz kluczy ssh i agenta ssh, możesz dość łatwo zrobić:

[enter]~[ctrl]-Z

Które będzie w tle ssh, a następnie po prostu scp $!:/whatever/whatever .'

Po przesłaniu pliku, fgaby odzyskać ssh.

Jeśli nie używasz kluczy ssh, nadal możesz używać opcji „ControlMaster” i „ControlPath” dodanych do najnowszych wersji OpenSSh, ale to staje się trudne, sprawdź man ssh_config

Spamapy
źródło
24

Zakładając, że korzystasz z serwera ssh na swoim pulpicie (istnieją na to sposoby, ale myślę, że wszystkie one zwiększają złożoność i mogą mieć problemy z bezpieczeństwem), możesz skonfigurować tunel ssh do tyłu. Zobacz SSH, jak łatwo skopiować plik do systemu lokalnego. na co unix.SE .

  • Wpisz, Enter ~C Enter -R 22042:localhost:22 Enteraby utworzyć zwrotne przekierowanie portów z serwera na pulpit (22042 może być dowolnym numerem portu z zakresu od 1024 do 65534, który nie jest używany).
  • Następnie scp -P 22042 foo localhost:skopiuje plik fooz bieżącego katalogu na serwerze do twojego domu na pulpicie.
  • Teraz przenieś plik do bieżącego katalogu na pulpicie, wpisując Enter ~ Ctrl+ Z mv ~/foo . Enter fg Enter.

Sekwencje specjalne Ssh zaczynają się od ~; tylda rozpoznawana jest dopiero po nowej linii. ~ Ctrl+Zumieszcza ssh w tle. ~Cwchodzi do wiersza poleceń, w którym można utworzyć lub usunąć przekazanie.

Gilles
źródło
1
Używanie 2 warstw szyfrowania i kompresji jest nieco przesadne, dlatego zasugerowałem użycie rsh lub ftp dla „linku wstecznego”.
JanC
2
@JanC: Wymaga to większej konfiguracji: musisz zainstalować serwer rsh lub ftp i upewnić się, że jego konfiguracja jest bezpieczna. Narzut szyfrowania jest minimalny nawet na netbooku.
Gilles
Serwer ssh również nie jest domyślnie instalowany. ;)
JanC
@JanC: Kolejną zaletą ssh jest to, że jeśli włączyłeś przekazywanie agentów, nie będziesz musiał wpisywać hasła, aby wykonać kopię. Wydajność przepływu pracy w porównaniu z mikroefektywnością obliczeniową.
Gilles
Możesz zrobić coś takiego również z (niektórymi) innymi usługami. W każdym razie istnieje wiele podobnych rozwiązań, z których wszystkie wymagają ponownego połączenia tunelowanego i dodatkowego demona ...;)
JanC
10

Wymyśliłem sposób na zrobienie tego ze standardowym ssh. Jest to skrypt, który powiela bieżące połączenie ssh, znajduje katalog roboczy na komputerze zdalnym i kopiuje określony plik na komputer lokalny. Potrzebuje 2 bardzo małych skryptów (1 zdalny, 1 lokalny) i 2 linii w konfiguracji ssh. Kroki są następujące:

  1. Dodaj te 2 linie do ~/.ssh/config:

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

    Teraz, jeśli masz połączenie ssh z maszyną X otwarte, nie będziesz potrzebować haseł, aby otworzyć kolejne.

  2. Utwórz 1-liniowy skrypt na zdalnym komputerze o nazwie ~/.grabCat.sh

    \#!/bin/bash<br>
    cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1
    
  3. Utwórz skrypt na lokalnej maszynie o nazwie ~ / .grab.sh

    \#!/bin/bash
    [ -n "$3" ] && dir="$3" || dir="."
    ssh "$1" ".grabCat.sh $2" > "$dir/$2"
    
  4. i utwórz alias dla grab.sh w ( ~/.bashrclub gdziekolwiek):

    alias grab=~/.grab.sh
    

To wszystko, gotowe. Teraz, jeśli jesteś zalogowany machineX:/some/directory, po prostu uruchom nowy terminal i wpisz

grab machineX filename

To umieszcza plik w bieżącym katalogu roboczym na komputerze lokalnym. Możesz podać inną lokalizację jako trzeci argument „grab”.

Uwaga: Oczywiście oba skrypty muszą być „wykonywalne”, tzn chmod u+x filename.

Sebix
źródło
Ciekawe, czy możesz wyjaśnić, jak to działa? Czy jesteś w stanie to rozszerzyć, aby obsługiwać zarówno „umieszczanie” plików, jak i ich pobieranie?
Peter Gibson
5

Jeśli twoja maszyna kliencka (maszyna, na której siedzisz) nazywa się maszyną A, a maszyna, na której aktualnie jesteś SSH, nazywa się maszyną B. MaszynaA, na twoim komputerze lokalnym musi być uruchomiony dysk SSHD i otwarty port 22. Następnie:

scp myfile machineA:

Kopiuje myfilena MachineB do mojego katalogu domowego MachineA na komputerze A. Zakłada się, że identyfikator użytkownika / hasło są takie same.

scp myfile machineA:/newdir/newname

Kopiuje myfilejeden komputer B /newdir/newnamena komputer A. Zakłada się, że identyfikator użytkownika / hasło są takie same.

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

Pobiera kopię otherfilez mojego katalogu MachineA na MachineA i umieszcza ją w moim bieżącym katalogu roboczym na maszynie MachineB (oznaczonym w standardowy sposób UNIX przez znak „kropka” (.)). Zakłada się, że identyfikator użytkownika / hasło są takie same.

Jeśli identyfikator użytkownika / hasło nie są takie same, użyj:

scp myfile user@MachineA: uzyskać plik.

scp user@MachineA:/path/to/my/otherfile . umieszczać pliki

UWAGI na temat SCP:

Podobnie jak cppolecenie, scpma opcję -p do propagowania ustawień uprawnień oryginalnego pliku do kopii (w przeciwnym razie kopia jest wykonywana z normalnymi ustawieniami dla nowych plików) oraz opcję -r do skopiowania całego drzewa katalogów za pomocą jednego Komenda.

scptworzy całkowicie przezroczysty zaszyfrowany kanał danych między dwoma komputerami, dzięki czemu dane binarne (takie jak obrazy lub programy wykonywalne) są poprawnie przechowywane. Oznacza to również, że scpnie jest w stanie wykonać automatycznej konwersji zakończenia linii między różnymi typami systemów operacyjnych, co można zrobić za pomocą ftp w trybie „ascii”. Nie będzie to stanowić problemu podczas kopiowania między systemami uniksowymi, które wszystkie używają tej samej konwencji końca linii.

LukeInDC
źródło
2

jeśli uzyskujesz dostęp do serwera przez ssh, możesz także łączyć się przez sftp. Miej pod ręką klienta Filezilla (GUI) i wklej ścieżkę, na której aktualnie jesteś

wprowadź opis zdjęcia tutaj

strumień
źródło
2
Przydałoby się to bardziej szczegółowo, w tym jak połączyć się z serwerem SSH za pomocą FileZilla (nie jest to oczywiste). Oprócz tekstu objaśniającego mogą również pomóc zrzuty ekranu .
Eliah Kagan,
2

Jeśli twój plik jest wystarczająco mały, możesz go zakodować za pomocą base64, a następnie odkodować lokalnie:

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

Oryginalna odpowiedź, skąd ją otrzymałem (i przetestowałem): https://unix.stackexchange.com/a/2869/194134

wesalius
źródło
Co to ma z tym wspólnego? Nie trzeba kodować plików, aby je txfrować za pomocą scp itp.
HörmannHH
1

To nie jest aktywne połączenie SSH, ale scp kopiuje pliki przy użyciu tych samych mechanizmów i uprawnień, co ssh.

msw
źródło
4
Jestem świadomy scp, ale jest to bardzo rozłączny przepływ pracy. Jeśli pracuję w danym zdalnym katalogu, muszę uzyskać zdalną ścieżkę, rozłączyć (lub spawnować kolejną powłokę), wykonać scping, zapisując ścieżki, a następnie ponownie się połączyć. Szukam czegoś, co przypomina pisanie get filei pojawia się magicznie na mojej lokalnej maszynie. Jeśli ma to zrobić za pośrednictwem usługi tunelowanej przez SSH, niech tak będzie. Ale powinno to być związane z sesją.
Oli
Plus został zastąpiony przez sftp (patrz moja odpowiedź)
Olivier Lalonde
@Oli - Ponieważ oba końce transakcji są skrzynkami * nix, prawdopodobnie oba mają sshduruchomione i dlatego powinieneś móc skorzystać scpz wiersza poleceń serwera, aby wyrzucić pliki z powrotem do klienta. Dookoła jest tylko tyle magii; czasami nadal musimy naciskać przyciski. Przydatne jest również rozwiązanie FileZilla.
zerobandwidth
1

Nie jest to możliwe w przypadku domyślnej sesji ssh, ale można użyć skryptu zamiast ssh, który uruchamia coś takiego jak prosty serwer ftp lub rsh w systemie lokalnym i uruchamia ssh z niezbędnymi opcjami, aby skonfigurować tunel z powrotem na pulpit do łączenia się z tym serwerem.

JanC
źródło
Lub może po prostu scp / rsync ...
HörmannHH
1

konsole ma tę możliwość poprzez menu „Edycja-> Prześlij ZModem”, gdy jesteś w sesji zdalnej (lub Ctrl-Alt-U).

Uwaga: lrzsznajpierw należy zainstalować pakiet . Dla mnie wygląda jak działa tylko do przesyłania plików ASCII.

strumień
źródło
0

Ponieważ łączysz się z pulpitu, myślę, że możesz otworzyć drugi terminal.

Tak często robię:

  • od pierwszego terminala, gdzie jedna sesja ssh działa, mam pełną ścieżkę do pliku, trzeba uzyskać, korzystając albo realpath myfilealbo readlink -f myfile(starsze wersje Ubuntu nie preinstalacji realpath) i skopiuj go.
  • z drugiego terminala, którego używam scplub, sftpaby pobrać plik, wklejając pełną ścieżkę, którą dostałem wcześniej. Na przykład:scp user@host:/etc/some/file ./

Jest to dość podstawowe, ale także łatwe do zapamiętania i nie wymaga dodatkowego pakietu do pracy.

uzyskaj pełną ścieżkę od pierwszego terminala, a następnie wklej drugi terminal

gerlos
źródło
Nie pomaga w problemie „próba uzyskania pliku root i bezpośrednie zalogowanie przez root jest niedozwolone”.
Oli
0

Zaskakujące, że nie widzę tu wzmianki o dobrym starym dowódcy o północy . Moim zdaniem jest to prawdopodobnie najbardziej uniwersalny i użyteczny menedżer plików dla powłoki z możliwościami zasilania, jedno z „niezbędnych narzędzi” do tej sprawy, które pozwala również na połączenie przez SSH, FTP, SFTP, podczas gdy na na drugim panelu możesz otworzyć dowolny (lokalny) system plików i dzięki temu swobodnie pracować z plikami.

Wszystko czego potrzebujesz to: apt-get install mc (z uniwersum)

Następnie uruchom mc, otwórz menu dla lewego lub prawego panelu, wybierz połączenie powłoki, wprowadź nazwę użytkownika @ remote-ip, hasło - właściwie to jest to ... skopiuj (tutaj: pobierz) pliki / foldery z jednego komputera na drugi za pomocą F5, poruszaj się za pomocą F6 i tak dalej, zgodnie z poniższymi przyciskami. Dla starych użytkowników MS: tak jak w NC dla DOS

Nex0
źródło
-2

SPOSÓB przemyślenia tego, ludzie. Szukałem też wszystkich głębokich, ciemnych, złożonych odpowiedzi. Okazuje się, że możesz to zrobić bezpośrednio z Dolphin prosto z puszki. fish: // nazwa użytkownika @ serwer: port

Zwycięzca
źródło
Nie rozumiem
Pierre.Vriens
Nie sądzę, że rozumiesz mój przypadek użycia. Jestem w aktywnej sesji wiersza poleceń SSH i chcę odesłać plik z powrotem na mój komputer lokalny z lokalizacji [potencjalnie uprzywilejowanej, tj. Niedostępnej przez SFTP]. Może nawet nie jest to geneza pliku, może to być wynik polecenia. Szukam jakiegoś sposobu, aby przywrócić go bez tworzenia plików pośrednich i rozpoczynania nowych sesji SFTP / SCP / etc.
Oli