Skopiować dane wejściowe do schowka przez SSH?


33

Oto mój przypadek użycia:

  • Często jestem podłączony do innych komputerów za pośrednictwem SSH do pracy i często muszę kopiować i wklejać dokumenty / tekst z serwera do lokalnie działających edytorów do pisania przykładów i udostępniania tekstu.
  • Często, jeśli tekst jest wystarczająco mały, po prostu skopiuję dane wyjściowe z mojego programu terminalowego (w tej chwili gnome-terminal) i wkleję go.
  • Jednak jeśli chodzi o całe dokumenty, moje opcje są dość ograniczone. Mogę skopiować dokument fragment po kawałku lub scpna komputer lokalny.

Czy istnieje sposób na użycie takiego programu, xclipktóry pozwoli mi skopiować zdalnie stdindo schowka lokalnego serwera X? Coś w efekcie:

cat myconffile.conf | sed {...} | copy-over-ssh-to-local-clipboard

byłoby wspaniale. Czy istnieje coś, co umożliwia to?

Odpowiedzi:


20

Jeśli uruchomisz ssh z X przekazywaniem, jest to przezroczyste: zdalne polecenia (w tym xclip) mają dostęp do twojego serwera X (w tym do jego klawiatury). Upewnij się, że masz to ForwardX11 yesna swoim ~/.ssh/configi X11Forwarding yesna serwerze sshd_config(w zależności od dystrybucji, te opcje mogą być domyślnie włączone lub wyłączone).

<myconffile.conf sed {...} | xclip -i

Istnieją inne sposoby pracy na zdalnych plikach, które mogą być wygodniejsze, na przykład montowanie zdalnych katalogów na komputerze lokalnym za pomocą SSHfs lub otwieranie zdalnych plików w Emacs za pomocą Trampa . Jeśli masz skonfigurowane ssh i FUSE oraz SSHfs, SSHfs jest tak proste jak mkdir ~/net/myserver; sshfs myserver:/ ~/net/myserver. Jeśli masz skonfigurowane ssh i zainstalowany Emacs, Tramp jest tak łatwy jak otwarcie /myserver:/path/to/file.


1
Czy są jakieś luki w zabezpieczeniach związane z domyślnym działaniem w ten sposób w pliku conf?
Naftuli Kay

Nie. Cały ruch x11 jest przekazywany kanałem SSH.
Shadur

2
@TKKocheran Nie bardzo. Po stronie serwera brak. Po stronie klienta trochę, ponieważ daje administratorowi serwera drogę do twojego klienta, ale w 99% przypadków administrator serwera i tak ma taką możliwość; zobacz Jeśli ktoś jest zalogowany do SSH na moim komputerze, czy mogę uzyskać dostęp do jego komputera?
Gilles „SO- przestań być zły”

7

Nie potrzebujesz niczego specjalnego; skoro xclipdziała stdin, po prostu

ssh remotehost xclip < myconf.conf

Dlaczego trzeba go modyfikować sed? sshjest przezroczysty dla danych, gdy nie jest używany jako terminal, i jest powszechnie stosowany w rurociągach takich jak

tar cfz - somedir | ssh remotehost 'cd destdir; tar xfz -'`

Czy można to zrobić w ramach istniejącej sesji SSH? Naprawdę wolałbym nie otwierać innego okna terminala, jeśli mam już jedno otwarte dla danego komputera.
Naftuli Kay

I sed` jest tylko przykładem, jeśli chciałbym wykonać jakiekolwiek przetwarzanie stdinprzed skopiowaniem go do schowka, chciałbym tę opcję.
Naftuli Kay

Nie, nie ma możliwości wstrzyknięcia danych do istniejącej sshsesji (nie byłoby to zbyt bezpieczne, gdybyś mógł). Możesz skonfigurować ssh ControlMasterrzeczy do multipleksowania dodatkowych połączeń na istniejącym, ale tak naprawdę nie jest to coś dla początkujących i nadal robisz to w ten sam sposób później, przełączając się na inny lokalny terminal i uruchamiając powyższą komendę (która nie otwiera nowego okno terminala).
geekozaur

@NaftuliKay Aby znaleźć rozwiązanie, które działa w normalnej sesji SSH, zobacz moją odpowiedź .
tanius

5

Oto, jak zrobiłbyś to w OSX z lokalnego komputera

ssh remotehost.com "<some/file.txt" | pbcopy

3

jeśli twój komputer lokalny ma system Windows (7+), możesz po prostu użyć tego z CommandLine:

ssh user@server cat /home/user/file | clip

1

~ / .ssh / config:

Host REMOTEHOST
    ...
    ForwardX11 yes

/ etc / ssh / sshd_config:

X11Forwarding yes

grzmotnąć:

$ xclip -o | ssh REMOTEHOST 'DISPLAY=:0 xclip -i'

1

Bardzo podobne do rozwiązań @ d-raev i @ william-casarin, jednak jest inaczej, więc dzielę się tym, co dla mnie zadziałało.

Komenda

ssh user@host "cat <myconffile.conf" | xclip -sel clip

Wyjaśnienie

Ten wykorzystuje sshdo stworzenia bezpiecznego tunelu, zaloguj się do user@ hostlub ip, a następnie wykonać cataby wydrukować zawartość <myconffile.confaby stdoutnastępnie potokiem że do polecenia xclip -sel clipna lokalnym komputerze, co plasuje zawartość <myconffile.confdo schowka na komputerze lokalnym.

Przykład użycia w świecie rzeczywistym

Używam tej struktury poleceń do zadań takich jak wklejanie kluczy ssh do github (pozwalając na proste wybranie Ctrl-V lub wklejanie zaznaczenia po uruchomieniu polecenia) w Bash na Ubuntu 16.04 i 18.04. Sprawdź man ssh, man catoraz man xclipdla zachowania i opcji szczegółów.


Działa to nawet do kopiowania z serwerów bezgłowych, gdzie xclipnie będzie działać, ponieważ nie ma X.
Tanius

0

Mam podobny problem z lxterminalwklejaniem schowka LUbuntu (testowałem różne terminale) do sshsesji. Jeśli schowek ma więcej niż około 100 bajtów, limit czasu sesji się kończy i kończy się niepowodzeniem.

Jeśli połączę się przez ssh z prawie dowolnym serwerem CentOS 5.x, a następnie połączę się z serwerem docelowym, wklejanie ze schowka działa bez problemu dla dowolnego rozsądnego rozmiaru danych.


0

Kopiowanie z serwera bezgłowego do lokalnego schowka, z wnętrza zwykłej sesji SSH:

  1. Zainstaluj ncatna komputerze lokalnym i zdalnym. (Na twoim zdalnym komputerze możesz także zrobić z nclub zwykłym telnet, ale na komputerze lokalnym potrzebujemy opcji do wykonywania poleceń ( -c/ -e), które nie są dostępne ncw zwykłych dystrybucjach, takich jak Debian i Ubuntu.)

    apt install nmap
    
  2. Na komputerze lokalnym skonfiguruj serwer nasłuchujący na interfejsie lokalnym, który skopiuje zawartość przychodzącą przez port 10009 do schowka X:

    ncat --keep-open --listen --sh-exec "xclip -selection clipboard" localhost 10009
    

    Lub użyj równoważnej wersji skróconej:

    ncat -klc "xclip -sel c" localhost 10009
    
  3. SSH do zdalnego komputera w taki sposób, że tunel zwrotny jest ustanawiany od portu 10008 zdalnego komputera do portu 10009 na lokalnym komputerze (gdzie nasłuchuje serwer). Możesz użyć tej sesji SSH do normalnej pracy.

    ssh -R 10008:localhost:10009 user@example.com
    
  4. Jeśli chcesz skopiować zawartość pliku ze zdalnego komputera do lokalnego schowka, uruchom w powłoce SSH:

    ncat --send-only localhost 10008 < file.txt
    

    I oczywiście jest to ładniejsze, gdy jest pakowane jako skrót powłoki lub skrypt. Możemy to nazwać rclip„zdalnym schowkiem” w sposób analogiczny do znanego xclip.

Zalety

  • Nie ma potrzeby otwierania kolejnej sesji SSH na zdalnym komputerze.

  • Nie ma potrzeby xclipkorzystania ze zdalnego komputera, więc działa, jeśli nie możesz go zainstalować lub nie możesz go używać, ponieważ jest to serwer bezgłowy bez X.

Bezpieczeństwo

Robimy to ncat -l localhost 10009dla serwera, co oznacza, że ​​nasłuchuje tylko na interfejsie sieciowym z localhostadresem IP. Ten lokalny interfejs pętli zezwala tylko na połączenia z własnego komputera (w tym, w tym przypadku, z tunelowaniem zwrotnym przez SSH). Więc nawet jeśli nie jesteś za firewallem, twój port 10009 nie jest narażony na nikogo w Internecie.

Źródło

Zaadaptowano z gist dergachev / ssh-forward-clipboard.md do pracy w systemie Linux. Ta lista zawiera również instrukcje, jak ustawić domyślny tunel zwrotny SSH.


-1

https://secure.wikimedia.org/wikipedia/en/wiki/Base64

Możesz przekonwertować dane ze schowka przy pomocy Base64 na tekst ASCII. Następnie możesz przepchnąć to przez już istniejące połączenie SSH.


Po co konwertować na cokolwiek? W tym przypadku jest już tekstem, a nawet jeśli byłby to plik binarny, nie byłoby powodu, dla którego nie można byłoby wysłać go przez taki potok.
Caleb

schowek może zawierać dane binarne, np .: skompilowaną aplikację
LanceBaynes

Tak, może, ale dlaczego miałby to stanowić problem? Dane binarne mogą być przesyłane przez tunel rurowy i ssh.
Caleb
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.