Jak skutecznie korzystać z ekranu i SSH?

12

Chciałbym skonfigurować SSH i ekran tak, aby login zawsze łączył się ponownie z sesją ekranową. Idealnie byłoby, gdyby ta sesja nie została zakończona, ale odłączyła się po naciśnięciu Cd. Jak można to osiągnąć? A jakie inne przydatne ustawienia ułatwiają moje życie SSH?

Tobias Kienzler
źródło

Odpowiedzi:

9

Po prostu zrobiłem następujące czynności dla wszystkich moich serwerów, więc kiedy łączę się przez SSH, automatycznie włączam się w sesję Screen.

Dodaj do ~ / .bashrc dla swoich kont użytkowników:

# Auto-screen invocation. see: http://taint.org/wk/RemoteLoginAutoScreen
# if we're coming from a remote SSH connection, in an interactive session
# then automatically put us into a screen(1) session.   Only try once
# -- if $STARTED_SCREEN is set, don't try it again, to avoid looping
# if screen fails for some reason.
if [ "$PS1" != "" -a "${STARTED_SCREEN:-x}" = x -a "${SSH_TTY:-x}" != x ] 
then
  STARTED_SCREEN=1 ; export STARTED_SCREEN
  screen -RR -S main || echo "Screen failed! continuing with normal bash startup"
fi
# [end of auto-screen snippet]

Spowoduje to rozpoczęcie sesji ekranowej o nazwie main, jeśli nie istnieje, lub ponowne połączenie z nią, jeśli ona istnieje. Stało się tak, ponieważ mam odłączone kilka innych sesji ekranu dla różnych usług i nie chcę się z nimi łączyć.

Daemon of Chaos
źródło
Chciałem tylko dodać, że kombinacja klawiszy CTRL-d jest standardem w ekranie, aby odłączyć się od uruchomionej sesji ekranu.
Daemon of Chaos
8

Na moim zdalnym serwerze mam następujące pliki .bash_profile:

if [ -z "${STY}" -a -t 0 -a X${USER} = Xarcege ]; then
    reattach() {
        if [ -n "${SSH_AUTH_SOCK}" ]; then
            ln -snf "${SSH_AUTH_SOCK}" "${HOME}/.ssh/agent-script"
            SSH_AUTH_SOCK="${HOME}/.ssh/agent-script" export SSH_AUTH_SOCK
        fi
        exec screen -A -D -RR ${1:+"$@"}
    }
    screen -wipe
    echo 'starting screen... (type Ctrl-C to abort)'
    sleep 5 && reattach
fi

Robi to dwie rzeczy: po pierwsze, ustawia funkcję powłoki w celu zastąpienia powłoki i przeniesienia połączenia ssh-agent, po drugie wywołuje tę funkcję po pauzie na kilka sekund (na wypadek, gdyby ekran nie chciał się uruchomić).

Pierwsza ifklauzula będzie prawdziwa, jeśli jeszcze nie uruchomiono screen ( -z "${STY}") podłączonego do terminalu ( -t 0) i nie uruchamiam sudo (co czasem się nie zmienia $USER).

reattachFunkcja będzie najpierw sprawdzić, czy ssh został wywołany z portu aktywnego ssh-agent ( -n "${SSH_AUTH_SOCK}"). Następnie zastąpi wszystko, co jest w ~/.ssh/agent-scriptaktualnie aktywnym pliku gniazda i zastąpi zmienną środowiskową ( $SSH_AUTH_SOCK) nową wartością. Następnie skrypt zastąpi bieżącą powłokę jedną screensesją (upewniając się, że tylko jedna powinna istnieć). Wszelkie argumenty reattachfunkcji są przekazywane do komendy ( ${1:+"$@"}).

Ostatnia część najpierw usuwa martwe sesje ( screen -wipe), informuje użytkownika (mnie), że ekran wkrótce się uruchomi i zamiast tego może powrócić do powłoki, naciskając Ctrl- C. Następnie czeka przez 5 sekund i wywołuje reattachfunkcję.

Arcege
źródło
4

Po pierwsze, jeśli używasz byobu, możesz skonfigurować nową sesję powłoki tak, aby zawsze automatycznie uruchamiała byobu (co jest zasadniczo ładną konfiguracją ekranu, chociaż nowsze wersje mogą używać tmux jako backendu). Jeśli naprawdę nie chcesz byobu, prawdopodobnie możesz ustawić ekran, aby łączył się ręcznie, edytując swój .profilelub inny skrypt konfiguracyjny powłoki, exec screenjeśli TERM != "screen".

Jeśli ci się to nie podoba, możesz użyć authorized_keyspliku, aby uruchomić określone polecenie dla połączeń z określonym kluczem (i możesz mieć tyle kluczy, ile chcesz). Zobacz man sshdszczegóły. Sugeruję, aby polecenie uruchomiło skrypt, który sprawdza, czy ekran jest uruchomiony i łączy się, w przeciwnym razie rozpocznie nową sesję.

Jeśli chodzi o rozłączanie na Ctrl-D, ekran pozwala skonfigurować mapowania klawiszy w twoim .screenrc. Zobacz man screenszczegóły. Szukasz „bindkey”.

ams
źródło
2

Być może zupełnie nie ma znaczenia dla twojego pytania, ale czy kiedykolwiek zastanawiałeś się nad użyciem TMUX. Zapewnia wiele funkcji, których szukasz od razu po wyjęciu z pudełka.

Na przykład. jeśli rozłączysz się z sesją SSH, gdy jesteś pod TMUX, wszystko, co musisz zrobić, to ssh back i uruchomić „tmux a”, aby dołączyć do sesji. Odkąd zacząłem używać TMUX, zapomniałem, jakie są polecenia nohup / disown ... jeśli chcesz coś uruchomić i wylogować się - uruchom to w Tmuxie i odłącz. Dane wyjściowe polecenia będą buforowane, aby można było je później przejrzeć.

aby automatycznie dołączyć, możesz dodać coś takiego jak poniżej .bashrc:

[ -z $TMUX ] && tmux list-sessions 2>/dev/null && tmux a

lub nawet łatwiej

tmux a 2>/dev/null

Ma mniejszą pamięć i ogólnie lepszą / łatwiejszą w użyciu opcję IMHO.

Skrót meta-d jest domyślnym odwzorowaniem do odłączenia w TMUX.

Alex
źródło
0

screen -dAr default || screen -AS defaultpracuje dla mnie. Dodaję to do mojego ~ / .bashrc .

Krótkie wyjaśnienie przełączników:

  • d - Odłącz ekran, jeśli jest nadal podłączony, z innej sesji.
  • A - Dostosuj okna na ekranie do nowego rozmiaru terminala.
  • r default - Dołącz do ekranu o nazwie default.

Jeśli pierwsze polecenie ekranowe (poprzednie ||) nie powiedzie się, uruchomione zostanie drugie:

  • A - Jak wyjaśniono powyżej ...
  • S default- Utwórz nową sesję ekranu z domyślną nazwą .
Batandwa
źródło
0

Sugeruję użycie byobu . To narzędzie wykorzystuje tmux i zapewnia ładny pasek narzędzi oraz inne wygodne opcje przełączania okien, skróty klawiszowe itp.

echo "new-session" >> ~/.byobu/.tmux.conf
echo "if [ -n '\$TMUX' ]; then :; else byobu attach; fi" >> ~/.bashrc

Za pomocą powyższych poleceń po udanym zalogowaniu SSH system spróbuje dołączyć do istniejącej sesji byobu-tmux, jeśli nie, utworzy nową sesję.

Sandeep
źródło