Jak mogę uruchomić sesję ekranową z poleceniem ssh na zdalnym serwerze z mojego pulpitu?

57

Chcę mieć możliwość uruchamiania sesji ekranowych na zdalnych serwerach z jednego polecenia ssh na moim pulpicie. Wygląda jednak na to, że screen potrzebuje terminala, który nie jest dostępny po uruchomieniu polecenia przez ssh.

To oczywiste

ssh [email protected] screen "tail -f /var/log/messages"

(jako przykład) nie działa i daje

Must be connected to a terminal.

Chcę, aby ssh uruchomił polecenie pod ekranem, abym mógł zalogować się później i dołączyć tak, jak do sesji ekranowej, którą uruchomiłem ręcznie.

Thomas Vander Stichele
źródło
Nawiasem mówiąc, możesz trafić w ten błąd nie przez złe użycie ekranu. Miałem funkcję powłoki, która wykonywała exec <foo, aby odczytać z pliku. Znacznie później w dużym skrypcie próbowałem uruchomić ekran. Wszystkie poniższe metody obv. nie udało się, ponieważ prawdziwym winowajcą był exec. Trzeba o tym pamiętać. Sprawdź, czy przypadkowo nie zabiłeś własnego stdina.
Neil McGill,

Odpowiedzi:

77

Spróbuj użyć opcji -t do ssh

ssh -t [email protected] screen "tail -f /var/log/messages"

Od człowieka ssh

-t Wymusza alokację pseudo-tty. Można to wykorzystać do wykonania arbi-
        trójstronne programy ekranowe na zdalnym komputerze, które mogą być
        bardzo przydatne, np. przy wdrażaniu usług menu. Wiele -t
        opcje wymuszają alokację tty, nawet jeśli ssh nie ma lokalnego tty.
Kjetil Joergensen
źródło
Próbuję tego samego z tmux ssh -t user@machine tmux attachi mogę dołączyć zdalną sesję tmux, ale zadziera z kodowaniem znaków. Wyświetla tylko znaki ascii. Czy można to naprawić?
Macario
1
@Macario możesz chcieć otworzyć osobne pytanie na ten temat, chociaż jest on stycznie powiązany, ponieważ uruchamiasz go za pomocą ssh -t, brzmi to bardziej jak ma to związek z ustawieniem LC_ * inaczej dla uruchamiania interaktywnego vs. nieinteraktywnego. Po przekazaniu wiersza polecenia ssh do wykonania zostanie on wykonany w środowisku nieinteraktywnym. Możliwe jest również, że nie jest przekazywana zmienna środowiskowa TERM podczas wykonywania nieinteraktywnego, w którym to przypadku tmux nie miałby pojęcia, jakie możliwości posiada terminal, i wraca do najmniej powszechnego mianownika.
Kjetil Joergensen
Nie używam ssh, ale mam ten sam problem. Proszę pomóż. serverfault.com/questions/861632/unable-to-run-code-in-screen
zhangjinzhou
32

Możesz użyć:

ssh root@host screen -m -d "tail -f /var/log/messages"

To uruchamia odłączony ekran z uruchomionym poleceniem.

   -m   causes screen  to  ignore  the  $STY  environment  variable.  With
        "screen  -m"  creation  of  a  new session is enforced, regardless
        whether screen is called from within  another  screen  session  or
        not.  This  flag has a special meaning in connection with the `-d'
        option:

   -d -m   Start screen in "detached" mode. This creates a new session but
           doesn't  attach  to  it.  This  is  useful  for  system startup
           scripts.
Alakdae
źródło
1
Twoja odpowiedź była równie dobra, szkoda, że ​​muszę wybrać. Może ktoś powinien edytować pierwszą odpowiedź i dodać twoje informacje.
Thomas Vander Stichele
8

Późna odpowiedź, ale tak właśnie robię, tworzę alias (nazwijmy to t), który robi to:

ssh $MYSERVER -a -x -t screen -xRR -A -e^Zz -U -O

Mówi to, sshaby wyłączyć przekazywanie agentów i X11, i screendołączyć do uruchomionej sesji, w razie potrzeby rozpocząć nową, użyć ^Zjako polecenia breakout, użyć UTF-8 i być mądrym w kwestii terminala.

Wszystko to oznacza, że ​​mogę otworzyć terminal, wpisać ti otworzy się moja sesja ekranowa na $ MYSERVER. Następnie mogę otworzyć inny terminal, zrobić to samo i uzyskać inne okno do tej samej sesji.

Naprawdę miło jest mieć wiele okien terminala do tej samej sesji ekranowej, dzięki czemu możesz spojrzeć na dwie karty ekranów jednocześnie.

w00t
źródło
1
Przeczytałem sporo stron, nie do końca odpowiadając na to, czego szukałem, ale ty to przybiłeś. Zakładam, że obecnie screen lub tmux są prawdopodobnie na większości serwerów, a te z którymi się łączę są potencjalnie efemeryczne, więc nie chciałem zadzierać z bashrc, jak sugeruje większość odpowiedzi. Możesz także ustawić tę funkcję w swojej powłoce i akceptować argumenty takie jak $ host i $ command (które umieściłbyś na końcu). Zamiast wpisywać na stałe swój alias do tjednego hosta, możesz połączyć go z nazwami hostów w swoim ssh_config.
dragon788
@ dragon788, rzeczywiście, uczyniłem to teraz funkcją i zastąpiłem $ MYSERVER „$ @”. Nadal często go używam.
w00t
4

Umieszczając następujące elementy w pliku ~ / .bashrc na moim serwerze, rozpoczyna sesję ekranową przy pierwszym logowaniu do serwera lub, jeśli już działa, ponownie łączy mnie z tą sesją.

Uważam to za bardzo przydatne:

if [ -n "$SSH_CONNECTION" ] && [ -z "$SCREEN_EXIST" ]; then
    export SCREEN_EXIST=1
    screen -DRi
fi
Brent
źródło
Próbowałem tego, ale kiedy screen -lsto robię, nie widzę żadnej sesji ekranowej
Tarun