Mam około dziesięciu serwerów, z którymi regularnie łączę się przez SSH. Każdy ma wpis w ~/.ssh/config
pliku mojego komputera lokalnego .
Aby uniknąć utraty kontroli nad uruchomionym procesem, gdy moje połączenie internetowe nieuchronnie spada, zawsze pracuję w ramach tmux
sesji. Chciałbym mieć możliwość automatycznego łączenia się tmux za każdym razem, gdy uruchamiane jest połączenie SSH, więc nie muszę zawsze wpisywać tmux attach || tmux new
po wejściu SSH.
Niestety nie okazuje się to tak proste, jak początkowo liczyłem.
- Nie chcę dodawać żadnych poleceń do
~/.bashrc
na serwerach, ponieważ chcę to tylko dla sesji SSH, a nie sesji lokalnych. - Dodanie
tmux attach || tmux new
do~/.ssh/rc
na serwerach powoduje po prostunot a terminal
wyrzucenie błędu po połączeniu, nawet jeśliRequestTTY force
opcja jest dodana do wiersza tego serwera w moim lokalnym pliku konfiguracyjnym SSH.
~/.ssh/config
: większość z was, którzy przyjeżdżają tutaj, prawdopodobnie nie szuka żadnej z pierwszych pięciu odpowiedzi, ale szóstej ( stackoverflow.com/a/52838493/5354137 ). Z każdą stosunkowo najnowszątmux
wersją jest to również najbardziej rozsądny sposób robienia rzeczy.Odpowiedzi:
Konfiguracja po stronie serwera:
Aby automatycznie uruchomić tmux na serwerze zdalnym podczas zwykłego logowania przez SSH (i tylko SSH), odpowiednio edytuj
~/.bashrc
użytkownika lub root (lub oba) na serwerze zdalnym:To polecenie tworzy sesję tmux o nazwie,
ssh_tmux
jeśli żadna nie istnieje, lub ponownie podłącza się do już istniejącej sesji o tej nazwie. W przypadku zerwania połączenia lub gdy zapomniałeś sesji kilka tygodni temu, każde logowanie SSH automatycznie przenosi Cię z powrotem do sesji tmux-ssh, którą zostawiłeś.Połącz się z klientem:
Po prostu nic specjalnego
ssh user@hostname
.źródło
ssh_tmux
na$USER
)$SSH_TTY
vs$SSH_CONNECTION
też.tmux new-session -A -s ssh_tmux
do zastąpieniatmux attach-session -t ssh_tmux || tmux new-session -s ssh_tmux
znacznie krótszego, jeśli nieco bardziej mylącego,-A
mówi tmuxowi, aby dołączył sesję, jeśli już istniejeif [[ -n "$PS1" ]] && [[ -z "$TMUX" ]] && [[ -n "$SSH_CONNECTION" ]];
$PS1
,[[ $- == *i* ]]
zamiast tego użyj , ponieważ PS1 może być zdefiniowane nawet wtedy, gdy nie jest powłoką interaktywną.W porządku, znalazłem w większości satysfakcjonujące rozwiązanie. W moim lokalnym
~/.bashrc
napisałem funkcję:co zasadniczo nadpisuje funkcję terminala ssh, aby wywołać wbudowany program ssh z podanymi argumentami, po których następuje
"tmux attach || tmux new"
.(Symbol
$@
oznacza wszystkie argumenty podane w linii poleceń, więcssh -p 123 user@hostname
zostanie rozwinięty dossh -t -p 123 user@hostname "tmux attach || tmux new"
)(
-t
Argument jest równoważny zRequestTTY Force
poleceniem tmux i jest dla niego niezbędny).źródło
tmux
obsługuje tę funkcję, rozważ użycie,tmux new -A foo
które dołączy do istniejącej sesji o nazwie,foo
jeśli to możliwe, tworząc ją w razie potrzeby. Pozwala to uprościć funkcję/usr/bin/ssh -t "$@" tmux new -A
(i koniecznie zacytować$@
!).function ssht
lub coś podobnego, aby móc nadalssh
normalnie używać . W przeciwnym razie po prostu wpisz/usr/bin/ssh
w wierszu polecenia za każdym razem, gdy łączysz się z komputerem bez tmux :)ssht
do~/bin
.ssh -t user@hostname "LANG=$LANG tmux attach || tmux new"
Połączyć:
Podczas sesji:
Służy
Ctrl+d
do kończenia sesji (zamykanie okna tmux) lubCtrl+b d
do tymczasowego odłączania się od sesji i ponownego łączenia się z nią później.Kiedy jesteś w środku tmux w dowolnym momencie, możesz użyć,
Ctrl+b s
aby wyświetlić listę sesji i przełączyć się na inną.Napraw swój .bashrc:
Polecam zdefiniowanie funkcji uniwersalnej w
.bashrc
:22
Domyślnie używa portu. Zdefiniuj również aliasy do szybkiego łączenia:Zaloguj się bez hasła:
A jeśli nie chcesz za każdym razem wpisywać hasła, to generować
.ssh
klucze do automatycznego logowania :Umieść swój klucz publiczny na zdalnym hoście:
Dodatkowe wskazówki:
Jeśli chcesz użyć tymczasowego identyfikatora sesji, który odpowiada lokalnej sesji bash, użyj jako identyfikatora tmux :
źródło
||
w niektórych przypadkach użytkowych jest włączenienew-session
w.tmux.conf
i tak zawsze używaćtmux a -t 0
.tmux new-session -A
który dołączy, jeśli istnieje, w przeciwnym razie utworzy nowy.Użyłem linii z @kingmeffisto (nie mogę komentować tej odpowiedzi) i dodałem wyjście, więc zakończenie tmux również kończy połączenie ssh. To jednak zepsuło sesje SFTP, więc
$SSH_TTY
zamiast tego musiałem sprawdzić$SSH_CONNECTION
.EDYCJA 4/2018: Dodano test dla interaktywnego terminala za pośrednictwem,
[[ $- =~ i ]]
aby umożliwić działanie narzędzi takich jak Ansible.źródło
Jak opisano w tym poście na blogu , możesz ssh, a następnie dołączyć do istniejącej sesji tmux za pomocą jednego polecenia:
źródło
tmux attach || tmux new
aby nowa sesja tmux nie była tworzona dla każdego połączenia). Problem polega na tym, że prawidłowe polecenie jestssh -t user@host tmux attach || tmux new
i jedynym sposobem na aliasowanie czegoś, co wymaga argumentu w ciągu polecenia, jest utworzenie nowej funkcji, tak jak zrobiłem powyżej.ssh [hostname] -t tmux attach -t [sessionName]
tmux 3.1 lub nowszy¹ na komputerze zdalnym
W lokalu
~/.ssh/config
wpisz²:Bez związku, ale jeśli masz do czynienia ze znakami spoza zestawu ASCII, zalecałbym zmianę tego na,
tmux -u …
aby jawnie włączyć obsługę Unicode nawet na maszynach, które nie mają ustawionych odpowiednich zmiennych środowiskowych.tmux 3.0a lub starsze na komputerze zdalnym
Prawie to samo co powyżej, ale zmień ostatni wiersz na³:
¹ Na dzień 2020-10-29 lista dystrybucji z tmux 3.1 lub nowszym jest już dość długa.
²
new
to skrót odnew-session
.³
at
to skrót odattach-session
.Alternatywna metoda wykorzystująca
authorized_keys
plik pilota :Jeśli wolisz nie mieć
~/.ssh/config
pliku z jakiegokolwiek powodu lub chcesz, aby zdalny komputer wymusił połączenie się / otwarcie sesji na maszynie łączącej, dodaj to do swojego pilota~/.ssh/authorized_keys
:Będzie to oczywiście działać na wszystkich klientach, którzy mają zainstalowany odpowiedni klucz prywatny, co może być wadą lub wadą, w zależności od tego, czego chcesz. Istnieje ryzyko, że jeśli coś pójdzie nie tak, połączenie może nie być już możliwe.
źródło
tmux at
zamiasttmux a
? Dobrze byłoby też użyć do tego nazwanej sesji, w przeciwnym razie tmux połączyłby się z „losowymi” istniejącymi sesjami po zalogowaniu się do hosta.Ctrl+A
Ctrl+Z
.Ctrl-B
D
prace traktują w porównaniu doCtrl-B
Ctrl-Z
. Dzięki!byobu to przydatne opakowanie tmux / screen. Łączy się z istniejącą sesją, jeśli jest obecna, lub tworzy nową.
Używam go z autosshem, który z wdziękiem ponownie łączy sesję ssh. Wysoce zalecane w przypadku sporadycznych problemów z łącznością.
źródło
Może Ci się to przydać - używa ssh w pętli i ponownie łączy się z istniejącą sesją tmux lub łączy się z nią, dzięki czemu masz łatwy, niezawodny sposób na ponowne połączenie po awarii sieci
źródło
To właśnie tworzy wspaniałe wrażenia użytkownika. Automatycznie uruchamia tmux za każdym razem, gdy otworzysz terminal (zarówno fizycznie, jak i ssh). Możesz rozpocząć pracę na jednym urządzeniu, wyjść z terminala i wznowić na drugim. Jeśli wykryje kogoś już dołączonego do sesji, utworzy nową sesję. Umieść go na serwerze , w zależności od powłoki
~/.zshrc
lub~/.bashrc
.if [[ -z "$TMUX" ]] ;then ID="$( tmux ls | grep -vm1 attached | cut -d: -f1 )" # get the id of a deattached session if [[ -z "$ID" ]] ;then # if not available attach to a new one tmux new-session else tmux attach-session -t "$ID" # if available attach to it fi fi
źródło
Wiem, że przywracam stary wątek, ale trochę popracowałem nad rozwiązaniem bashrc i myślę, że ma to jakieś zastosowanie:
Na razie obowiązuje limit 10 (11) sesji - nie chciałem zabijać mojego serwera nieskończoną pętlą w bashrc. Wydaje się, że działa całkiem niezawodnie, z wyjątkiem błędu polegającego na niepowodzeniu tmux na klientach list, jeśli sesja nie istnieje.
źródło
Ten sposób umożliwia ponowne połączenie się ze starą instancją tmux, jeśli sesja ssh spadnie.
exec
Oszczędza widelec oczywiście.źródło