Ich habe ungefähr zehn Server, mit denen ich mich regelmäßig mit SSH verbinde. Jeder hat einen Eintrag in der ~/.ssh/config
Datei meines lokalen Computers .
Um zu vermeiden, dass ich die Kontrolle über meinen laufenden Prozess verliere, wenn meine Internetverbindung unvermeidlich unterbrochen wird, arbeite ich immer in einer tmux
Sitzung. Ich möchte, dass tmux jedes Mal, wenn eine SSH-Verbindung gestartet wird, automatisch eine Verbindung herstellt, sodass ich nicht immer tmux attach || tmux new
nach dem SSH eingeben muss .
Leider ist dies nicht so einfach, wie ich es mir ursprünglich erhofft hatte.
- Ich möchte
~/.bashrc
den Servern auf den Servern keine Befehle hinzufügen, da ich sie nur für SSH-Sitzungen und nicht für lokale Sitzungen verwenden möchte. - Das Hinzufügen
tmux attach || tmux new
zu den~/.ssh/rc
Servern führt einfach dazu, dass der Fehlernot a terminal
nach der Verbindung ausgelöst wird, selbst wenn dieRequestTTY force
Option der Zeile für diesen Server in meiner lokalen SSH-Konfigurationsdatei hinzugefügt wird.
~/.ssh/config
: Die meisten von Ihnen, die hierher kommen, suchen wahrscheinlich nicht nach einer der ersten fünf Antworten, sondern nach der sechsten ( stackoverflow.com/a/52838493/5354137 ). Mit jeder einigermaßen aktuellentmux
Version ist dies auch die sinnvollste Art, Dinge zu tun.Antworten:
Serverseitige Konfiguration:
Um tmux automatisch auf Ihrem Remote-Server zu starten, wenn Sie sich normalerweise über SSH (und nur über SSH) anmelden, bearbeiten Sie das
~/.bashrc
Ihres Benutzers oder Root (oder beides) auf dem Remote-Server entsprechend:Dieser Befehl erstellt eine tmux-Sitzung, die aufgerufen wird,
ssh_tmux
wenn keine vorhanden ist, oder stellt eine Verbindung zu einer bereits vorhandenen Sitzung mit diesem Namen her. Falls Ihre Verbindung unterbrochen wurde oder Sie vor Wochen eine Sitzung vergessen haben, bringt Sie jede SSH-Anmeldung automatisch zu der tmux-ssh-Sitzung zurück, die Sie zurückgelassen haben.Verbinden Sie sich von Ihrem Client aus:
Nichts Besonderes, nur
ssh user@hostname
.quelle
ssh_tmux
$USER
$SSH_TTY
vs$SSH_CONNECTION
auch.tmux new-session -A -s ssh_tmux
, umtmux attach-session -t ssh_tmux || tmux new-session -s ssh_tmux
viel kürzer zu ersetzen , wenn etwas verwirrender,-A
tmux anweist, die Sitzung anzuhängen, wenn es bereits existiertif [[ -n "$PS1" ]] && [[ -z "$TMUX" ]] && [[ -n "$SSH_CONNECTION" ]];
$PS1
,[[ $- == *i* ]]
sondern verwendet stattdessen PS1, auch wenn es sich nicht um eine interaktive Shell handelt.Okay, ich habe eine meist zufriedenstellende Lösung gefunden. In meinem Lokal habe
~/.bashrc
ich eine Funktion geschrieben:Dies überschreibt im Grunde die ssh-Terminalfunktion, um das eingebaute ssh-Programm mit den angegebenen Argumenten aufzurufen, gefolgt von
"tmux attach || tmux new"
.(Das
$@
bezeichnet alle in der Befehlszeile angegebenen Argumente undssh -p 123 user@hostname
wird daher auf erweitert.ssh -t -p 123 user@hostname "tmux attach || tmux new"
)(Das
-t
Argument entsprichtRequestTTY Force
dem Befehl tmux und ist für diesen erforderlich.)quelle
tmux
unterstützt, sollten Sie in Betracht ziehen, zu verwenden,tmux new -A foo
welche an eine vorhandene Sitzung mit dem Namenfoo
angehängt wird, wenn möglich, und sie gegebenenfalls erstellen. Auf diese Weise können Sie Ihre Funktion vereinfachen/usr/bin/ssh -t "$@" tmux new -A
(und unbedingt zitieren$@
!).function ssht
damit Sie diessh
normale Verwendung fortsetzen können. Andernfalls geben Sie einfach/usr/bin/ssh
an der Eingabeaufforderung ein, wenn Sie eine Verbindung zu einem Computer ohne tmux herstellen :)ssht
zu~/bin
.ssh -t user@hostname "LANG=$LANG tmux attach || tmux new"
Verbinden:
Während der Sitzung:
Verwenden Sie
Ctrl+d
diese Option , um die Sitzung zu beenden (das tmux-Fenster wird geschlossen) oderCtrl+b d
um sich vorübergehend von der Sitzung zu trennen und später erneut eine Verbindung herzustellen .Wenn Sie in tmux jederzeit sind , können Sie verwenden ,
Ctrl+b s
um zu sehen Sitzungen Liste und Schaltstrom zu einem anderen.Korrigieren Sie Ihre .bashrc:
Ich empfehle Ihnen, die universelle Funktion in Ihrem zu definieren
.bashrc
:22
Standardmäßig wird der Port verwendet . Definieren Sie auch Ihre Fast-Connect-Aliase:Login ohne Passwort:
Und wenn Sie nicht jedes Mal ein Passwort eingeben möchten, generieren Sie
.ssh
Schlüssel, um sich automatisch anzumelden :Legen Sie Ihren öffentlichen Schlüssel auf dem Remote-Host ab:
Zusätzliche Tipps:
Wenn Sie eine temporäre Sitzungs-ID verwenden möchten, die einer lokalen Bash-Sitzung entspricht, verwenden Sie diese als tmux- ID:
quelle
||
in einigen Anwendungsfällen ist enthaltennew-session
in.tmux.conf
und einfach immer verwendentmux a -t 0
.tmux new-session -A
welche angehängt werden, falls vorhanden, andernfalls wird eine neue erstellt.Ich habe Zeilen von @kingmeffisto verwendet (ich darf diese Antwort nicht kommentieren) und einen Exit hinzugefügt, damit durch das Beenden von tmux auch die ssh-Verbindung beendet wird. Dies brach jedoch SFTP-Sitzungen, so dass ich
$SSH_TTY
statt suchen musste$SSH_CONNECTION
.EDIT 4/2018: Test für interaktives Terminal über hinzugefügt
[[ $- =~ i ]]
, damit Tools wie Ansible funktionieren können.quelle
Wie in diesem Blog-Beitrag beschrieben , können Sie mit einem einzigen Befehl ssh und dann eine Verbindung zu einer vorhandenen tmux-Sitzung herstellen:
quelle
tmux attach || tmux new
damit nicht für jede Verbindung eine neue tmux-Sitzung erstellt wird). Der schwierige Teil ist, dass der richtige Befehl istssh -t user@host tmux attach || tmux new
und der einzige Weg, etwas zu aliasen, das ein Argument in der Befehlszeichenfolge benötigt, darin besteht, eine neue Funktion zu erstellen, wie ich es oben getan habe.ssh [hostname] -t tmux attach -t [sessionName]
tmux 3.1 oder neuer¹ auf dem Remote-Computer
In Ihrem lokalen
~/.ssh/config
, put²:Unabhängig, aber wenn Sie mit Nicht-ASCII-Zeichen arbeiten, würde ich empfehlen, dies zu ändern,
tmux -u …
um die Unicode-Unterstützung auch auf Computern explizit zu aktivieren, auf denen nicht die richtigen Umgebungsvariablen festgelegt sind.tmux 3.0a oder älter auf dem Remote-Computer
Fast das gleiche wie oben, aber ändern Sie die letzte Zeile in ³:
¹ Ab dem 29.10.2020 ist die Liste der Distributionen, die mit tmux 3.1 oder neuer ausgeliefert werden, bereits ziemlich lang.
²
new
ist die Abkürzung fürnew-session
.³
at
ist die Abkürzung fürattach-session
.Alternative Methode unter Verwendung der Remote-
authorized_keys
Datei:Wenn Sie
~/.ssh/config
aus irgendeinem Grund lieber keine Datei haben möchten oder möchten, dass der Remotecomputer den Verbindungscomputer zwingt, eine Verbindung zur Sitzung herzustellen oder diese zu öffnen, fügen Sie diese zu Ihrer Remote hinzu~/.ssh/authorized_keys
:Dies funktioniert natürlich von allen Clients, auf denen der entsprechende private Schlüssel installiert ist. Dies kann je nach Wunsch entweder ein Vorteil oder ein Nachteil sein. Es besteht die Gefahr, dass im Falle eines Fehlers möglicherweise keine Verbindung mehr hergestellt werden kann.
quelle
tmux at
statttmux a
? Es wäre auch ratsam, eine benannte Sitzung für diese zu verwenden, oder tmux würde beim Anmelden am Host an "zufällige" vorhandene Sitzungen angehängt.Ctrl+A
Ctrl+Z
.Ctrl-B
D
Werke behandeln im Vergleich zuCtrl-B
Ctrl-Z
. Vielen Dank!byobu ist ein netter nützlicher Wrapper für tmux / screen. Stellt eine Verbindung zu einer vorhandenen Sitzung her, falls vorhanden, oder erstellt eine neue.
Ich benutze es mit Autossh, das die SSH-Sitzung ordnungsgemäß wieder verbindet. Sehr zu empfehlen bei zeitweiligen Verbindungsproblemen.
quelle
Dies ist möglicherweise hilfreich - verwendet ssh in einer Schleife und stellt eine Verbindung zu einer vorhandenen tmux-Sitzung her oder stellt eine Verbindung zu dieser her, sodass Sie nach einem Netzwerkausfall eine einfache und zuverlässige Möglichkeit haben, die Verbindung wiederherzustellen
quelle
Dies ist derjenige, der tatsächlich eine großartige Benutzererfahrung schafft. Es startet tmux automatisch, wenn Sie das Terminal öffnen (sowohl physisch als auch ssh). Sie können Ihre Arbeit an einem Gerät beginnen, das Terminal verlassen und auf dem anderen fortfahren. Wenn jemand erkannt wird, der bereits mit der Sitzung verbunden ist, wird eine neue Sitzung erstellt. Stellen Sie es auf den Server , abhängig von Ihrer Shell
~/.zshrc
oder~/.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
quelle
Ich weiß, dass ich einen alten Thread wiederbelebe, aber ich habe einige Arbeiten an der bashrc-Lösung durchgeführt und ich denke, dass sie eine Verwendung hat:
Derzeit gibt es eine Obergrenze von 10 (11) Sitzungen - ich wollte meinen Server nicht mit einer Endlosschleife in bashrc beenden. Es scheint ziemlich zuverlässig zu funktionieren, abgesehen von dem Fehler, dass tmux auf Listen-Clients fehlschlägt, wenn die Sitzung nicht existiert.
quelle
Auf diese Weise können Sie die Verbindung zu einer alten tmux-Instanz wiederherstellen, wenn Ihre SSH-Sitzung unterbrochen wird. Das
exec
spart natürlich eine Gabel.quelle