Jak wysłać dane do lokalnego schowka ze zdalnej sesji SSH

161

Pytanie Borderline ServerFault, ale programuję kilka skryptów powłoki, więc najpierw próbuję :)

Większość * nixów ma polecenie, które pozwoli ci potokować / przekierować wyjście do lokalnego schowka / tablicy i pobrać je z tego samego. W systemie OS X te polecenia to

pbcopy, pbpaste 

Czy istnieje możliwość replikacji tej funkcji podczas korzystania z SSHed na innym serwerze? To jest,

  1. Używam komputera A.
  2. Otwieram okno terminala
  3. I SSH do komputera B
  4. Wykonuję polecenie na komputerze B.
  5. Dane wyjściowe komputera B są przekierowywane lub automatycznie kopiowane do schowka komputera A.

I tak, wiem, że mógłbym po prostu (wzdrygnąć się) użyć myszy, aby wybrać tekst z polecenia, ale przyzwyczaiłem się do przepływu pracy bezpośredniego przeskakiwania danych wyjściowych do schowka, że ​​chcę tego samego dla moich sesji zdalnych.

Kod jest przydatny, ale mile widziane jest również podejście ogólne.

Alan Storm
źródło

Odpowiedzi:

89

Wskrzeszam ten wątek, ponieważ szukałem takiego samego rozwiązania i znalazłem takie, które działa na mnie. To niewielka modyfikacja sugestii z OSX Daily .

W moim przypadku używam Terminala na mojej lokalnej maszynie OSX do łączenia się z serwerem linux przez SSH. Podobnie jak w przypadku OP, chciałem móc przesyłać małe fragmenty tekstu z terminala do mojego lokalnego schowka, używając tylko klawiatury.

Istota rozwiązania:

commandThatMakesOutput | ssh desktop pbcopy

Po uruchomieniu w sesji ssh na komputerze zdalnym, polecenie to pobiera dane wyjściowe polecenia commandThatMakesOutput (np. Ls , pwd) i kieruje je do schowka komputera lokalnego (nazwa lub adres IP „pulpitu”). Innymi słowy, używa zagnieżdżonego ssh: łączysz się z komputerem zdalnym przez jedną sesję ssh, wykonujesz tam polecenie, a komputer zdalny łączy się z twoim pulpitem za pośrednictwem innej sesji ssh i umieszcza tekst w schowku.

Wymaga skonfigurowania twojego pulpitu jako serwera ssh (co zostawiam Tobie i Google). Jest to o wiele łatwiejsze, jeśli skonfigurowałeś klucze ssh, aby ułatwić szybkie korzystanie z ssh, najlepiej używając hasła na sesję lub cokolwiek wymagają tego Twoje potrzeby bezpieczeństwa.

Inne przykłady:

ls  | ssh desktopIpAddress pbcopy
pwd |  ssh desktopIpAddress pbcopy

Dla wygody utworzyłem plik bash, aby skrócić tekst wymagany po potoku:

#!/bin/bash
ssh desktop pbcopy

W moim przypadku używam specjalnie nazwanego klucza

Zapisałem go z nazwą pliku cb (mój mnemonik (ClipBoard). Umieść skrypt gdzieś w swojej ścieżce, uczyń go wykonywalnym i voila:

ls | cb
rhileighalmgren
źródło
3
Często robię to w vimie. Aby to zrobić, wybierz, co chcesz skopiować w trybie wizualnym, a następnie wpisz::'<,'>w !ssh desktop pbcopy
Mike Brennan
@MikeBrennan Kiedy zaznaczysz tekst, dlaczego nie naciśniesz po prostu cmd + C (lub dowolnego klawisza kopiowania, który ustawiłeś)? ...
Petr Peller,
36
W ten sposób działa tak naprawdę tylko wtedy, gdy twój pulpit ma statyczny adres IP i jest dostępny z pudełka, do którego się włączyłeś. Mnie to nigdy nie dotyczy.
kqw
6
Czy na odwrót nie byłoby łatwiej? ssh user @ remote 'commandThatMakesOutput' | pbcopy
rulio
Potrzebowałem -e noneflagi ssh opisanej tutaj: unix.stackexchange.com/questions/210615/…
Pat Myron
122

Mój ulubiony sposób to ssh [remote-machine] "cat log.txt" | xclip -selection c. Jest to najbardziej przydatne, gdy nie chcesz (lub nie możesz) ssh ze zdalnego do lokalnego.

Edycja: na Cygwin ssh [remote-machine] "cat log.txt" > /dev/clipboard.

Edycja: pomocny komentarz od nbren12:

Prawie zawsze jest możliwe skonfigurowanie odwrotnego połączenia SSH przy użyciu przekierowania portu SSH. Po prostu dodaj RemoteForward 127.0.0.1:2222 127.0.0.1:22do wpisu serwera w swoim lokalnym .ssh/config, a następnie wykonaj ssh -p 2222 127.0.0.1na zdalnym komputerze, który następnie przekieruje połączenie na komputer lokalny. - nbren12

Dominykas Mostauskis
źródło
6
+1: O wiele łatwiejsze niż inne rozwiązania, gdy odwrotne połączenie SSH nie jest możliwe!
John Dibling
9
Za to niezwykle proste rozwiązanie zasługujesz na więcej lajków!
Kamil Dziedzic
31
Dla tych z nas, którzy ssh [remote-machine] "cat log.txt" | pbcopy
używają
1
Zgodnie z tym sprawozdaniem tutaj , musiałem użyć cat, aby uzyskać to do pracy na cygwin Windows 8: ssh [remote-machine] "cat log.txt" | cat > /dev/clipboard(oczywiście mój zdalne polecenia nie było cat, to było coś innego wewnątrz Vagrant maszynie wirtualnej, więc faktycznie ran vagrant ssh -c "command" | cat > /dev/clipboard)
Tiby
7
To jest prawie zawsze możliwe w konfiguracji odwrotnej połączenie ssh za pomocą przekierowania portów SSH. Po prostu dodaj RemoteForward 127.0.0.1:2222 127.0.0.1:22do wpisu serwerów w swoim lokalnym .ssh/config, a następnie wykonaj ssh -p 2222 127.0.0.1na zdalnym komputerze, który następnie przekieruje połączenie na komputer lokalny.
nbren12
30

Znalazłem świetne rozwiązanie, które nie wymaga odwrotnego połączenia ssh!

Możesz użyć xclip na zdalnym hoście, wraz z przekazywaniem ssh X11 i XQuartz w systemie OSX.

Aby to ustawić:

  1. Zainstaluj XQuartz (zrobiłem to z solistą + pivotal_workstation :: przepis xquartz , ale nie musisz)
  2. Uruchom XQuartz.app
  3. Otwórz preferencje XQuartz ( kb_command+ ,)
  4. Upewnij się, że zaznaczone są opcje „Włącz synchronizację” i „Aktualizuj stół montażowy po zmianach SCHOWKA”Przykład okna preferencji XQuartz
  5. ssh -X remote-host "echo 'hello from remote-host' | xclip -selection clipboard"
TrinitronX
źródło
1
Czym to się różni od ssh remote-host "echo 'hello from remote-host' | pbcopy? To byłaby doskonała odpowiedź, gdyby działało coś takiego: ssh -X remote-hostwtedy na zdalnym hoście:echo 'hello from remote-host' | xclip -selection clipboard
kqw
5
@KasperSouren. Uważam, że działa tak, jak masz nadzieję. Plik `| xclip` znajduje się wewnątrz podwójnych cudzysłowów.
gdw2
1
W 2016 roku jest to oczywiście NAJLEPSZE, proste rozwiązanie. Zapomnij o innych rozwiązaniach opartych na odwróconym ssh.
shivams
1
Czy można to zrobić bez jednorazowego polecenia? Chcę być zalogowany na serwerze zdalnym w sesji interaktywnej przez ssh, a następnie móc dowolnie wysyłać do mojego lokalnego schowka. Czy to wymaga odwrotnego ssh?
Kwas
2
@Kvass: Tak długo, jak używasz -Xdo przekazywania X11 przez SSH, programy X11 będą mogły aktualizować twój schowek za pomocą powyższych ustawień XQuartz. Jednorazowym poleceniem jest zademonstrowanie, że wysłanie czegoś przez echodo schowka zdalnego hosta za pośrednictwem xclipdziała i powinno zostać zsynchronizowane z lokalnym hostem klienta SSH. Zwróć uwagę, jak mówi @ gdw2: „Znak | xclipznajduje się w podwójnych cudzysłowach”. W związku z tym wykona jako polecenie na serwerze zdalnym, aby wysłać coś do schowka.
TrinitronX,
18

Port odwrotnego tunelu na serwerze ssh

Wszystkie istniejące rozwiązania wymagają:

  • X11 na kliencie (jeśli go masz, xclip na serwerze działa świetnie) lub
  • klient i serwer muszą znajdować się w tej samej sieci (co nie ma miejsca, jeśli próbujesz uzyskać dostęp do komputera w domu).

Oto inny sposób, aby to zrobić, chociaż musisz zmodyfikować sposób podłączania ssh do komputera.

Zacząłem go używać i nie jest tak onieśmielający, jak wygląda, więc spróbuj.

Klient (uruchamianie sesji ssh)

ssh username@server.com -R 2000:localhost:2000

(wskazówka: uczyń to klawiszem, więc nie musisz go wpisywać)

Klient (inna zakładka)

nc -l 2000 | pbcopy

Uwaga: jeśli nie masz, pbcopypo prostu teeto do pliku.

Serwer (wewnątrz sesji SSH)

cat some_useful_content.txt | nc localhost 2000

Inne notatki

Właściwie nawet jeśli jesteś w trakcie sesji ssh, istnieje sposób na uruchomienie tunelu, ale nie chcę odstraszać ludzi od tego, co naprawdę nie jest tak złe, na jakie wygląda. Ale szczegóły dodam później, jeśli zobaczę jakieś zainteresowanie

Sridhar Sarnobat
źródło
1
+1 - to całkiem fajne. Jednak - cat some_useful_content.txt | nc localhost 2000polecenie wydaje się zawieszać, kiedy to robię. Muszę ręcznie wykonać ctr-c, aby to zatrzymać, i dopiero wtedy zawartość trafia do mojego klipu / stołu montażowego klienta
Alan Storm
1
Będzie czekać, aż ktoś usunie dane z kolejki po drugiej stronie.
Sridhar Sarnobat
Właściwie myślę, że źle zrozumiałem twoje pytanie. Nie jestem pewien, dlaczego tak się dzieje.
Sridhar Sarnobat
nc -l -pdziała dla mnie, ale po prostu nc -lnie. Mam też problem z @AlanStorm.
HappyFace
1
Rozwiązałem problem zawieszania się netcata, podając -c. Używam GNU netcat zainstalowanego przez brew.
HappyFace
7

Istnieją różne narzędzia umożliwiające dostęp do wyborów X11, w tym xclip i XSel . Zauważ, że X11 tradycyjnie ma wiele wyborów, a większość programów ma pewne zrozumienie zarówno schowka, jak i podstawowego wyboru (które nie są takie same). Emacs może również pracować z drugorzędnym wyborem, ale to rzadkie i nikt tak naprawdę nie wie, co zrobić z obciętymi buforami ...

$ xclip -help
Użycie: xclip [OPCJA] [PLIK] ...
Uzyskaj dostęp do wyboru serwera X do czytania lub pisania.

  -i, -in wczytuje tekst do zaznaczenia X ze standardowego wejścia lub plików
                   (domyślna)
  -o, -out wypisuje zaznaczenie na standardowe wyjście (zazwyczaj dla
                   rurociąg do pliku lub programu)
  -l, -loops liczba żądań wyboru, na które należy czekać przed zakończeniem
  -d, -display wyświetlacz X do połączenia (np. localhost: 0 ")
  -h, -help informacje o użytkowaniu
      - wybór dostępu („podstawowy”, „pomocniczy”, „schowek” lub „wycinanie z bufora”)
      -noutf8 nie traktuj tekstu jako utf-8, użyj starego unicode
      -wersja informacje o wersji
      -Tylko ciche błędy, uruchamiane w tle (domyślnie)
      -cichy bieg na pierwszym planie, pokaż, co się dzieje
      -werbalny komentarz bieżący

Zgłaszaj błędy do <[email protected]>
$ xsel -help
Użycie: xsel [opcje]
Manipuluj zaznaczeniem X.

Domyślnie bieżący wybór jest wyprowadzany i nie jest modyfikowany, jeśli oba
standardowe wejście i standardowe wyjście to terminale (ttys). Inaczej,
bieżący wybór jest wyprowadzany, jeśli standardowe wyjście nie jest terminalem
(tty), a wybór jest dokonywany ze standardowego wejścia, jeśli jest to standardowe wejście
nie jest terminalem (tty). Jeśli podano opcje wejścia lub wyjścia, to
program zachowuje się tylko w żądanym trybie.

Jeśli wymagane jest zarówno wejście, jak i wyjście, poprzedni wybór jest
wyjście przed zastąpieniem zawartością standardowego wejścia.

Opcje wprowadzania
  -a, --append Dołącza standardowe wejście do zaznaczenia
  -f, --follow Dołącza do zaznaczenia, gdy rośnie standardowe wejście
  -i, --input Odczytuje standardowe wejście do zaznaczenia

Opcje wyjściowe
  -o, --output Wypisz zaznaczenie na standardowe wyjście

Opcje akcji
  -c, --clear Czyści zaznaczenie
  -d, --delete Żąda wyczyszczenia zaznaczenia i tak dalej
                        aplikacja będąca jej właścicielem usunie jej zawartość

Opcje wyboru
  -p, --primary Działa na PODSTAWOWYM zaznaczeniu (domyślne)
  -s, --secondary Działa na WTÓRNYM wyborze
  -b, --clipboard Działa na wyborze SCHOWEK

  -k, --keep Nie modyfikuje wyborów, ale czyni PODSTAWOWYM
                        i WTÓRNE wybory są zachowywane nawet po
                        programy, które zostały wybrane przy wyjściu.
  -x, --exchange Zamienia PODSTAWOWE i WTÓRNE wybory

Opcje X
  --display nazwa wyświetlana
                        Określ połączenie z serwerem X.
  -t ms, --selectionTimeout ms
                        Określ limit czasu w milisekundach, w którym
                        należy pobrać zaznaczenie. Wartość 0 (zero)
                        określa brak limitu czasu (domyślnie)

Różne opcje
  -l, --logfile Określa plik, w którym będą rejestrowane błędy po odłączeniu.
  -n, --nodetach Nie odłącza się od kontrolującego terminala. Bez
                        ta opcja, xsel rozwidli się i stanie się tłem
                        proces w trybach wprowadzania, wymiany i zachowania.

  -h, --help Wyświetl tę pomoc i zakończ
  -v, --verbose Wyświetla komunikaty informacyjne
  --version Wyświetla informacje o wersji i kończy pracę

Prosimy o zgłaszanie błędów do <[email protected]>.

Krótko mówiąc, powinieneś spróbować xclip -i/ xclip -olub xclip -i -sel clip/ xclip -o -sel cliplub xsel -i/ xsel -olub xsel -i -b/ xsel -o -b, w zależności od tego, czego chcesz.

ephemient
źródło
4
Aby dodać do @ephemient „s stanowisko: W celu użycia xclip & Xsel ze zdalnym hostem, można użyć X11 Forwarding tak: ssh -C -X user@remote-host. Jeśli wydaje się, że uruchomienie xclip po stronie zdalnej nie działa, upewnij się, że X11Forwarding yesjest ustawione w /etc/ssh/sshd_configpliku zdalnym . Upewnij się również, że xauthjest zainstalowany po stronie zdalnej. W przypadku maszyny bezgłowej można zainstalować xauthi xvfb.
TrinitronX
Oto opis z dodatkowymi szczegółami i powiązaniami klawiszy vim.
Tim Bunce,
1
@TrinitronX oh wow - waląc głową w ścianę, dzięki za xvfbwzmiankę. Używałem bezgłowego serwera, więc X11 nie mógł działać!
Cam
5

To jest moje rozwiązanie oparte o tunel zwrotny SSH, netcat i xclip.

Najpierw utwórz skrypt (np. Clipboard-daemon.sh) na swojej stacji roboczej:

#!/bin/bash
HOST=127.0.0.1
PORT=3333

NUM=`netstat -tlpn 2>/dev/null | grep -c " ${HOST}:${PORT} "`
if [ $NUM -gt 0 ]; then
    exit
fi

while [ true ]; do
    nc -l ${HOST} ${PORT} | xclip -selection clipboard
done

i uruchom go w tle.

./clipboard-daemon.sh&

Po otrzymaniu części danych rozpocznie przesyłanie danych wyjściowych przez nc do xclip i proces odradzania

Następnie uruchom połączenie ssh ze zdalnym hostem:

ssh user@host -R127.0.0.1:3333:127.0.0.1:3333

Po zalogowaniu się na zdalnym komputerze spróbuj tego:

echo "this is test" >/dev/tcp/127.0.0.1/3333

następnie spróbuj wkleić na swojej stacji roboczej

Możesz oczywiście napisać skrypt opakowujący, który najpierw uruchamia sesję clipboard-daemon.sh, a następnie ssh. Tak to działa u mnie. Cieszyć się.

Krzysztof Księżyk
źródło
To rozwiązanie najlepiej mi się sprawdziło. nie jest to zbyt skomplikowane i działa poprawnie.
Marcel Valdez Orozco
Najlepsze moim zdaniem rozwiązanie. Nie musisz martwić się o zezwolenie na odwrotne połączenie ssh, które ma wpływ na bezpieczeństwo, a nieskończona pętla jest miłym akcentem.
R. Taukulis
4

Nie jest to jedna linijka, ale nie wymaga dodatkowego ssh .

  • zainstalować, netcatjeśli to konieczne
  • używać termbin : cat ~/some_file.txt | nc termbin.com 9999. Spowoduje to skopiowanie danych wyjściowych do termbinwitryny internetowej i wydrukowanie adresu URL do wyniku.
  • odwiedź ten adres URL z komputera, otrzymasz wynik

Oczywiście nie używaj go do wrażliwych treści.

maxbellec
źródło
Wow, to bardzo kreatywne rozwiązanie.
Sridhar Sarnobat
3

Ta odpowiedź rozwija obie na wybraną odpowiedź , dodając więcej bezpieczeństwa.

Ta odpowiedź dotyczyła ogólnej formy

<command that makes output> | \
    ssh <user A>@<host A> <command that maps stdin to clipboard>

Gdzie zabezpieczenie może być brak jest w sshuprawnienia pozwalające <user B>na host B>na sshna host Ai wykonać dowolną komendę.

Oczywiście Bdo Adostępu mogą być już ogrodzony przez sshklucz, a nawet może mieć hasło. Ale inna warstwa zabezpieczeń może ograniczyć zakres dozwolonych poleceń, które Bmogą być wykonywane A, np. Tak, że rm -rf /nie można ich wywołać. (Jest to szczególnie ważne, gdy sshklucz nie ma hasła).

Na szczęście sshma wbudowaną funkcję o nazwie ograniczenie poleceń lub polecenie wymuszone . Zobacz ssh.com lub to pytanie serverfault.com .

Poniższe rozwiązanie przedstawia ogólne rozwiązanie formularza wraz z ssh ograniczeniami poleceń wymuszonym .

Przykład Rozwiązanie z ograniczeniami poleceń dodanymi

To ulepszone rozwiązanie pod względem bezpieczeństwa ma ogólną formę - połączenie z sshsesji host-Bto po prostu:

cat <file> | ssh <user-A>@<host A> to_clipboard

Reszta tego pokazuje konfigurację, aby to zadziałało.

Konfiguracja ograniczenia polecenia ssh

Załóżmy, że konto użytkownika na Bto user-B, a B ma klucz ssh id-clip, który został utworzony w zwykły sposób ( ssh-keygen).

Następnie w user-Akatalogu ssh znajduje się plik

/home/user-A/.ssh/authorized_keys

który rozpoznaje klucz id-clipi umożliwia sshpołączenie.

Zwykle zawartość każdego wiersza authorized_keysjest dokładnie autoryzowanym kluczem publicznym, np. Zawartość id-clip.pub.

Jednak aby wymusić ograniczenie poleceń , zawartość klucza publicznego jest poprzedzona (w tym samym wierszu) poleceniem, które ma zostać wykonane.
W naszym przypadku:

command="/home/user-A/.ssh/allowed-commands.sh id-clip",no-agent-forwarding,no-port-forwarding,no-user-rc,no-x11-forwarding,no-pty <content of file id-clip.pub>

Wyznaczone polecenie "/home/user-A/.ssh/allowed-commands.sh id-clip"i tylko to wyznaczone polecenie jest wykonywane za każdym razem, gdy klawisz id-clipjest używany do zainicjowania sshpołączenia host-A- bez względu na to, jakie polecenie jest zapisane w sshwierszu poleceń .

Polecenie wskazuje plik skryptu allowed-commands.sh, a zawartość tego pliku to

#/bin/bash
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.

Id=${1}

case "$SSH_ORIGINAL_COMMAND" in
    "to-clipboard")
          notify-send "ssh to-clipboard, from ${Id}"
        cat | xsel --display :0 -i -b
          ;;
    *)
        echo "Access denied"
        exit 1
        ;;
esac

Pierwotnym wezwaniem sshna maszynę Bbyło

... | ssh <user-A>@<host A> to_clipboard

Ciąg to-clipboardjest przekazywany do allowed-commands.shzmiennej środowiskowej SSH_ORIGINAL_COMMAND. Dodatkowo przekazaliśmy nazwę klucza id-clipz linii, do authorized_keysktórej ma dostęp tylkoid-clip .

Linia

          notify-send "ssh to-clipboard, from ${Id}"

to tylko wyskakujące okienko z wiadomością, które informuje, że trwa pisanie schowka - to prawdopodobnie dobra funkcja bezpieczeństwa. ( notify-senddziała na Ubuntu 18.04, może nie inne).

W linii

cat | xsel --display :0 -i -b

parametr --display :0jest niezbędny, ponieważ proces nie ma własnego wyświetlacza X ze schowkiem, więc musi być wyraźnie określony. Ta wartość :0działa na Ubuntu 18.04 z serwerem okien Wayland. W innych konfiguracjach może nie działać. W przypadku standardowego serwera X ta odpowiedź może pomóc.

host-A /etc/ssh/sshd_config parametry

Na koniec kilka parametrów /etc/ssh/sshd_configna hoście, Aktóre należy ustawić, aby zapewnić pozwolenie na połączenie i pozwolenie na używanie ssh-key tylko bez hasła:

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A

Aby sshdserwer ponownie odczytał plik config

sudo systemctl restart sshd.service

lub

sudo service sshd.service restart

wniosek

Konfiguracja to-clipboardwymaga pewnego wysiłku, ale inne funkcje oprócz tego mogą być konstruowane równolegle w tym samym frameworku.

Craig Hicks
źródło
1
Xsel z zdalnym przekazywaniem był jedyną odpowiedzią, która działała dla mnie na Ubuntu 18.04 z lokalnie i3. Nie jest potrzebne przekazywanie X11.
Jay Stanley
2

Najprostsze rozwiązanie ze wszystkich, jeśli korzystasz z systemu OS X przy użyciu terminala i przebywasz na zdalnym serwerze i chcesz pobrać wyniki z pliku tekstowego, dziennika lub pliku csv, po prostu:

1) Cmd-K aby wyczyścić wyjście terminala

2) cat <filename> aby wyświetlić zawartość pliku

3) Cmd-S aby zapisać dane wyjściowe terminala

Będziesz musiał ręcznie usunąć pierwszą i ostatnią linię pliku, ale ta metoda jest nieco prostsza niż poleganie na innych pakietach do zainstalowania, "odwróconych tunelach" i próbie posiadania statycznego adresu IP itp.

tw0000
źródło
+1 za przydatną technikę, której sam użyłem, ale zmusza cię to do utraty historii terminala i (jak wspomniano) problem z pierwszą / ostatnią linią jest trochę kłopotliwy.
Alan Storm,
Uzgodniono @AlanStorm
tw0000
Bardziej znaczącym problemem związanym z tym podejściem jest to, że oszczędza ono tylko liczbę linii zachowanych w buforze terminala. Często nie stanowi to problemu, ale jeśli próbujesz pobrać zawartość pliku dziennika, może zabraknąć miejsca,
Sridhar Sarnobat
To prawda @ Sridhar-Sarnobat, generalnie nie jest to zbyt dobre rozwiązanie. Po prostu używam scp!
tw0000