J'ai une dizaine de serveurs auxquels je me connecte régulièrement avec SSH. Chacun a une entrée dans le ~/.ssh/config
fichier de mon ordinateur local .
Pour éviter de perdre le contrôle de mon processus en cours lorsque ma connexion Internet tombe inévitablement, je travaille toujours dans une tmux
session. Je voudrais un moyen pour que tmux se connecte automatiquement à chaque fois qu'une connexion SSH est démarrée, donc je n'ai pas à toujours taper tmux attach || tmux new
après que je sois connecté en SSH.
Malheureusement, ce n'est pas aussi simple que je l'espérais au départ.
- Je ne veux pas ajouter de commandes au
~/.bashrc
sur les serveurs car je le veux uniquement pour les sessions SSH, pas pour les sessions locales. - L'ajout
tmux attach || tmux new
à~/.ssh/rc
sur les serveurs entraîne simplement l'erreurnot a terminal
générée après la connexion, même lorsque l'RequestTTY force
option est ajoutée à la ligne pour ce serveur dans mon fichier de configuration SSH local.
~/.ssh/config
: la plupart d'entre vous qui viennent ici ne recherchent probablement aucune des cinq premières réponses, mais la sixième ( stackoverflow.com/a/52838493/5354137 ). Avec toutetmux
version raisonnablement récente , c'est aussi la façon la plus sensée de faire les choses.Réponses:
Configuration côté serveur:
Pour démarrer automatiquement tmux sur votre serveur distant lorsque vous vous connectez normalement via SSH (et uniquement SSH), modifiez le
~/.bashrc
de votre utilisateur ou root (ou les deux) sur le serveur distant en conséquence:Cette commande crée une session tmux appelée
ssh_tmux
s'il n'en existe pas, ou se rattache à une session déjà existante avec ce nom. Si votre connexion est interrompue ou si vous avez oublié une session il y a des semaines, chaque connexion SSH vous ramène automatiquement à la session tmux-ssh que vous avez laissée.Connectez-vous depuis votre client:
Rien de spécial, juste
ssh user@hostname
.la source
ssh_tmux
en$USER
)$SSH_TTY
vs$SSH_CONNECTION
aussi.tmux new-session -A -s ssh_tmux
pour remplacertmux attach-session -t ssh_tmux || tmux new-session -s ssh_tmux
beaucoup plus court, si un peu plus déroutant,-A
dit à tmux de joindre la session si elle existe déjàif [[ -n "$PS1" ]] && [[ -z "$TMUX" ]] && [[ -n "$SSH_CONNECTION" ]];
$PS1
, utilisez[[ $- == *i* ]]
plutôt, car PS1 peut être défini même s'il ne s'agit pas d'un shell interactif.D'accord, j'ai trouvé une solution plutôt satisfaisante. Dans ma section locale
~/.bashrc
, j'ai écrit une fonction:qui écrase fondamentalement la fonction de terminal ssh pour appeler le programme ssh intégré avec les arguments donnés, suivis de
"tmux attach || tmux new"
.(Le
$@
désigne tous les arguments fournis sur la ligne de commande, ilssh -p 123 user@hostname
sera donc développé enssh -t -p 123 user@hostname "tmux attach || tmux new"
)(L'
-t
argument est équivalent àRequestTTY Force
et est nécessaire pour la commande tmux.)la source
tmux
prend en charge, envisagez d'utilisertmux new -A foo
qui s'attachera à une session existante nomméefoo
si possible, en la créant si nécessaire. Cela vous permet de simplifier votre fonction à/usr/bin/ssh -t "$@" tmux new -A
(et assurez-vous de citer$@
!).function ssht
ou autre pour pouvoir continuer à utiliserssh
normalement. Sinon, tapez simplement/usr/bin/ssh
à l'invite de commande chaque fois que vous vous connectez à une machine sans tmux :)ssht
vers~/bin
.ssh -t user@hostname "LANG=$LANG tmux attach || tmux new"
Relier:
Pendant la session:
Utilisez
Ctrl+d
pour terminer la session (la fenêtre tmux se ferme) ouCtrl+b d
pour se détacher temporairement de la session et s'y reconnecter plus tard.Lorsque vous êtes dans tmux à tout moment, vous pouvez utiliser
Ctrl+b s
pour voir la liste des sessions et passer à une autre.Réparez votre .bashrc:
Je vous recommande de définir la fonction universelle dans votre
.bashrc
:Il utilise le
22
port par défaut. Définissez également vos alias de connexion rapide:Connexion sans mot de passe:
Et si vous ne voulez pas saisir de mot de passe à chaque fois, générez des
.ssh
clés pour vous connecter automatiquement :Mettez votre clé publique sur l'hôte distant:
Conseils supplémentaires:
Si vous souhaitez utiliser un identifiant de session temporaire qui correspond à une session bash locale, utilisez comme identifiant tmux :
la source
||
est d'inclure dans certains cas d' utilisationnew-session
dans.tmux.conf
et il suffit d' utiliser toujourstmux a -t 0
.tmux new-session -A
qui s'attachera s'il existe, sinon il en créera un nouveau.J'ai utilisé des lignes de @kingmeffisto (je ne suis pas autorisé à commenter cette réponse) et j'ai ajouté une sortie afin de terminer tmux met également fin à la connexion ssh. Cela a cependant cassé les sessions SFTP, j'ai donc dû vérifier au
$SSH_TTY
lieu de$SSH_CONNECTION
.EDIT 4/2018: Ajout d'un test pour le terminal interactif via
[[ $- =~ i ]]
pour permettre à des outils comme Ansible de fonctionner.la source
Comme décrit dans cet article de blog, vous pouvez ssh, puis vous attacher à une session tmux existante avec une seule commande:
la source
tmux attach || tmux new
pour qu'une nouvelle session tmux ne soit pas créée pour chaque connexion). La partie délicate est que la commande correcte estssh -t user@host tmux attach || tmux new
et la seule façon d'aliaser quelque chose qui nécessite un argument dans la chaîne de commande est de créer une nouvelle fonction, comme je l'ai fait ci-dessus.ssh [hostname] -t tmux attach -t [sessionName]
tmux 3.1 ou plus récent¹ sur la machine distante
Dans votre local
~/.ssh/config
, mettez²:Indépendant, mais si vous avez affaire à des caractères non ASCII, je vous recommande de le changer
tmux -u …
pour activer explicitement le support Unicode, même sur des machines qui n'ont pas les variables d'environnement appropriées.tmux 3.0a ou plus ancien sur la machine distante
Presque la même chose que ci-dessus, mais remplacez la dernière ligne par³:
¹ À partir du 2020-10-29, la liste des distributions livrées avec tmux 3.1 ou plus récent est déjà assez longue.
²
new
est l'abréviation denew-session
.³
at
est l'abréviation deattach-session
.Méthode alternative utilisant le
authorized_keys
fichier de la télécommande :Si vous préférez ne pas avoir de
~/.ssh/config
fichier pour une raison quelconque, ou si vous souhaitez que la machine distante force la machine connectée à se connecter / ouvrir la session, ajoutez ceci à votre télécommande~/.ssh/authorized_keys
:Cela fonctionnera bien sûr à partir de tous les clients ayant la clé privée correspondante installée, ce qui pourrait être un inconvénient ou un inconvénient, selon ce que vous voulez. Il y a un risque que, en cas de problème, il ne soit plus possible de se connecter.
la source
tmux at
au lieu detmux a
? De plus, il serait sage d'utiliser une session nommée pour cela ou tmux s'attacherait à des sessions existantes "aléatoires" lors de la connexion à l'hôte.Ctrl+A
Ctrl+Z
.Ctrl-B
D
fonctionne traiter par rapport àCtrl-B
Ctrl-Z
. Merci!byobu est un joli wrapper utile pour tmux / screen. Se connecte à une session existante si elle est présente ou en crée une nouvelle.
Je l'utilise avec autossh qui reconnecte gracieusement la session ssh. Fortement recommandé en cas de problèmes de connectivité intermittents.
la source
Vous pourriez trouver cela utile - utilise ssh dans une boucle et se reconnecte ou se connecte à une session tmux existante afin que vous ayez un moyen fiable et simple de vous reconnecter après une panne de réseau
la source
C'est celui qui crée en fait une excellente expérience utilisateur. Il démarre automatiquement tmux chaque fois que vous ouvrez le terminal (à la fois physiquement et ssh). Vous pouvez commencer votre travail sur un appareil, quitter le terminal et reprendre sur l'autre. S'il détecte quelqu'un déjà attaché à la session, il créera une nouvelle session. Mettez-le sur le serveur , en fonction de votre shell
~/.zshrc
ou~/.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
la source
Je sais que je suis en train de relancer un ancien thread, mais j'ai travaillé sur la solution bashrc et je pense qu'elle a une certaine utilité:
Il y a un plafond à 10 (11) sessions pour l'instant - je ne voulais pas tuer mon serveur avec une boucle infinie dans bashrc. Cela semble fonctionner de manière assez fiable, à part l'erreur de l'échec de tmux sur les clients de liste si la session n'existe pas.
la source
Cette méthode vous permet de vous reconnecter à une ancienne instance tmux si votre session ssh tombe. Le
exec
sauve bien sûr une fourchette.la source