Jak mogę podłączyć wyjście jednego terminala z innego terminala?


45

Muszę podpiąć się do wyjścia aktualnie działającego terminala (tty1) z terminala wirtualnego i przechwycić go (działający serwer X).


5
Rozumiem, że czasami zachodzi potrzeba przechwytywania zawartości na innym terminalu po uruchomieniu polecenia, jednak uncja zapobiegania jest warta funta lekarstwa, dlatego zawsze należy rozważyć użycie screenlub tmuxprzed uruchomieniem polecenia, do którego dostęp można uzyskać z innego terminala .
depquid

A jeśli możesz go przygotować wcześniej, być może również kolega byłby dobrym kandydatem, który działa nawet w Internecie, a nie tylko lokalnym. (i ma opcjonalny dostęp do zapisu)
rugk

Odpowiedzi:


23

Natknąłem się na to jedno narzędzie o nazwie ttylog. Jest to program Perl dostępny w CPAN tutaj . Ma kilka ostrzeżeń, jednym z nich jest to, że mogłem tylko wymyślić, jak podłączyć do terminala, który został stworzony jako część kogoś, kto wpada do mojego pudełka. Z drugiej strony musisz uruchomić go z podwyższonymi uprawnieniami (tj. Root lub sudo).

Ale to działa!

Na przykład

Najpierw ssh do twojego pudełka w TERMINIE 1:

TERM#1% ssh saml@grinchy

Zwróć uwagę na tty tego nowego terminala:

TERM#1% tty
/dev/pts/3

Teraz w innym terminalu (TERM # 2) uruchom następującą komendę:

TERM#2% ttylog pts/3
DEBUG: Scanning for psuedo terminal pts/3
DEBUG: Psuedo terminal [pts/3] found.
DEBUG: Found parent sshd pid [13789] for user [saml]

Teraz wróć do TERMINU 1 i napisz coś, pojawi się w TERMINIE 2.

ss terminali

Wszystkie polecenia, których próbowałem (top, ls itp.) Działały bez żadnych incydentów ttylog.


Dokładnie to, czego szukałem (korzystałem z niej w przeszłości, ale zapomniałem nazwy i nie pamiętałem). Wielkie dzięki, tymczasowo użyłem brudnej opcji (replikacja gdb i wyjściowa).
pruzinat

Tak, to gdbbyła pierwsza opcja, z którą się zetknąłem. W przeszłości korzystałem z niej sam, ale dla mnie jest to hacking. Cieszę się, że to pomogło!
slm

1
Wydaje się, że ttylog nie może dołączyć się do prawidłowego procesu - czy ktoś może odpowiedzieć na moje pytanie: serverfault.com/questions/560972
LittleBobbyTables 12.12.13

21

Rzeczywiście jest. Urządzenia / dev / vcs * i / dev / vcsa * odpowiadają urządzeniom / dev / tty * (wirtualnym terminalom). F1 = tty1 = vcs1 / vcsa1 i tak dalej. Vcs / vcsa jest jak tty dla „bieżącego” terminala wirtualnego.

Jako root możesz po prostu przechwycić te urządzenia (np. Cat / dev / vcs2) i zobaczyć, co jest na odpowiednim VT (np. / Dev / tty2 on na F2), na przykład zrobić migawkę. vcsa * różni się od vcs * tym, że zawierają informacje o wymiarach terminala (ekranu). Pamiętaj, że jest to tylko migawka postaci wyświetlanych na ekranie - zebranych z pamięci przydzielonej do terminala - więc nie oczekuj ładnego, łatwego do przeanalizowania wyniku.

Wadą jest to, że jeśli informacje migają zbyt szybko, może to być trudne do uchwycenia. Być może tail -f / dev / vcs1 zadziała, jeśli musisz wykonać kilka screenów (sam nie próbowałem)? Najłatwiej jest po prostu przekierować go najpierw do pliku. Dobrym pomysłem może być również użycie VT (F1-F6), aby na niego spojrzeć, ponieważ zaciski będą miały takie same wymiary. Z mojego doświadczenia wynika, że ​​najlepiej używać urządzeń vcs * - nie vcsa * -.

Jeśli to nie zadziała, być może jeden z pakietów „big Brotherish”, który pozwala administratorowi obserwować aktywność na terminalu, może działać.

PS: Zapomniałem zapytać, jakiego systemu operacyjnego używasz. Dotyczy to Linuksa, chociaż podobne urządzenia prawdopodobnie istnieją również w innych systemach operacyjnych. Spróbuj wyszukać „wirtualną pamięć konsoli” wśród stron podręcznika dla urządzeń.


Czy jest jakiś sposób na wstrzyknięcie wejścia do tty1 z ssh? Na przykład muszę pracować z Raspberry Pi z systemem Debian, ale problem polega na tym, że ma tylko jeden port USB, jest zajęty przez adapter Wi-Fi, więc nie mogę fizycznie podłączyć klawiatury, aby używać z nim tty1. Ponieważ muszę uruchomić skrypt, który podczas wykonywania się wyłącza wlan0, faktycznie mam sytuację catch-22, która próbuje debugować, gdzie ten skrypt nie działa. Załóżmy, że nie mogę użyć koncentratora USB ... Czy jest jakiś sposób na przeniesienie znaków do / dev / tty1?
Steven Lu,

2
Dobrze. Jestem w stanie przesyłać rzeczy do /dev/tty1roota, ale wszystko to wyświetla znaki na ekranie, nie wpisując ich
Steven Lu

1
Przepraszam, jeśli to tylko hałas. to nie jest w 100% istotne. Ale odpowiedział na moje pytanie w komentarzu powyżej z tym
Steven Lu

18

patrzeć na:

man 1 script

na przykład:

script -f /dev/tty1

Szukałem tego. Próba przywiązania screennie powiodła się. To działa.
sdkks,

5

Użyj ttypolecenia w każdym terminalu, aby je zidentyfikować:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

Zakładając te TTY, aby przekierować stdout pierwszego na drugi, uruchom to w pierwszym terminalu:

exec 1>/dev/pts/1

Uwaga: Teraz każde wyjście komendy będzie wyświetlane na pts / 1

Aby przywrócić domyślne zachowanie standardowego punktu pts / 0:

exec 1>/dev/pts/0

Obejrzyj ten film, aby zobaczyć demonstrację.


2

To działało dla mnie:

  • Używając klawiatury na komputerze „A” (tj. Fizycznym komputerze, który ma być kontrolowany), uruchom: screen -q

  • Połącz się sshz komputerem „B” do komputera „A”.

  • W sesji ssh wpisz:, screen -lsaby uzyskać identyfikator sesji, z którym chcesz się połączyć (4 cyfry w wierszu zawierającym tty ).

  • Połącz się z powyższą sesją za pomocą: screen -x <session id>... używając numeru identyfikacyjnego sesji otrzymanego z screen -lspowyższego polecenia.

Wszystko wpisane w jednej z „sesji” będzie miało miejsce w obu „sesjach”, więc na przykład pisanie screen -dspowoduje wyjście z OBU sesji.


1

Innym podejściem jest użycie screennarzędzia gnu na komputerze lokalnym. Wywołaj go z -Lopcją lub zacznij bez tej opcji i użyj ^aHsekwencji poleceń. Każde z tych podejść powoduje, że wszystkie dane wejściowe i wyjściowe są rejestrowane w pliku o nazwie, screenlog.xgdzie x to numer ekranowy.

Jest to przydatne, ponieważ na komputerze zdalnym nie trzeba instalować żadnych dodatkowych elementów.


1

Ponieważ nie uruchomiłem tty1 z ekranem, ten skrypt pomógł:

Użyłem odpowiedzi Baarda Kopperuda powyżej. „128” to 1 linia mojego tty1. Uśpienie można ustawić na odpowiednią liczbę.

#!/bin/bash
while true
do
    sudo tail -c 128 /dev/vcs1 && echo ""
    sleep 10
done

Użyłem tego w terminatorze i tak dopasowałem kolumnę, aby przewiń był jednym wierszem tekstu.


Dzięki za pomysł, na rasperry musiałem po prostu zrobić „oglądać kota / dev / vcs” „Aby obejrzeć proces, zacząłem na wirtualnej konsoli, zapominając o użyciu„ ekranu ”. Właśnie dostosowałem terminal gnome i uruchomiłem go, aby miał szerokość 80 znaków.
axkibe

0

Otwórz dwa terminale. Wpisz ttykażdy, a dostaniesz jego identyfikator jako/dev/pts/nº

Następnie w pierwszym wpisujesz, script -f /dev/pts/nºofSecondTerminala w drugim robisz odwrotnie, script -f /dev/pts/nºofFirstTerminalaby się połączyć

Gratulacje! Oba terminale wysyłają i odbierają te same rzeczy. Potrzebujesz trzeciej? Studiowałeś kombinacje? Będziesz potrzebował 6 script -fpoleceń. Jeszcze więcej tty? Wkrótce...

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.