Comment démarrer automatiquement tmux sur SSH session?

j'ai une dizaine de serveurs auxquels je me connecte régulièrement avec SSH. Chacune a une entrée dans mon ordinateur local ~/.ssh/config fichier.

pour éviter de perdre le contrôle de mon processus d'exécution quand ma connexion Internet tombe inévitablement, je travaille toujours à l'intérieur d'un tmux session. J'aimerais que tmux se connecte automatiquement chaque fois qu'une connexion SSH est démarrée, donc je n'ai pas à taper tmux attach || tmux new après je SSH.

malheureusement, cela ne se révèle pas être aussi simple que je l'espérait 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.
  • ajouter tmux attach || tmux new~/.ssh/rc sur les serveurs entraîne simplement l'erreur not a terminal être lancé après connexion, Même si le RequestTTY force l'option est ajoutée à la ligne pour ce serveur dans mon fichier de configuration SSH local.
44
demandé sur Alex Ryan 2014-12-23 05:18:17

7 réponses

configuration Côté Serveur:

pour démarrer automatiquement tmux sur votre serveur distant lorsque vous vous connectez habituellement via SSH( et seulement SSH), éditez le ~./bashrc de votre utilisateur ou root (ou les deux) sur le serveur distant en conséquence:

if [[ -z "$TMUX" ]] && [ "$SSH_CONNECTION" != "" ]; then
    tmux attach-session -t ssh_tmux || tmux new-session -s ssh_tmux
fi

cette commande crée une session tmux appelée ssh_tmux si aucune n'existe, ou rattache à une session déjà existante avec ce nom. Dans le cas où votre connexion est tombée ou lorsque vous avez oublié une session il y a des semaines, chaque connexion SSH automatiquement vous ramène à la session tmux-ssh que vous avez laissé derrière vous.

se Connecter à partir de votre client:

Rien de spécial, juste ssh user@hostname.

42
répondu kingmeffisto 2016-10-22 13:02:51

D'accord, j'ai trouvé une solution satisfaisante. Dans mon local ~/.bashrc, j'ai écrit une fonction:

function ssh () {/usr/bin/ssh -t $@ "tmux attach || tmux new";}

qui écrase fondamentalement la fonction terminal ssh pour appeler le programme SSH intégré avec les arguments donnés, suivi de "tmux attach || tmux new".

($@ indique tous les arguments fournis sur la ligne de commande, donc ssh -p 123 user@hostname sera étendu à ssh -t -p 123 user@hostname "tmux attach || tmux new")

(-t l'argument est équivalent à

35
répondu Alex Ryan 2017-10-10 22:19:58

Comme décrit dans ce post vous pouvez SSH et ensuite vous attacher à une session tmux existante avec une seule commande:

ssh hostname -t tmux attach -t 0
7
répondu Fabian Pedregosa 2015-12-24 09:16:11

j'ai utilisé des lignes de @kingmeffisto (Je n'ai pas le droit de commenter cette réponse) et j'ai ajouté une sortie Donc terminer tmux met également fin à la connexion ssh. Cela a toutefois cassé les sessions SFTP donc j'ai dû vérifier pour $SSH_TTY au lieu de $SSH_CONNECTION.

EDIT 4/2018: test ajouté pour le terminal interactif via [[ $- =~ i ]] pour permettre à des outils comme L'outil de fonctionner.

if [ -z "$TMUX" ] && [ -n "$SSH_TTY" ] && [[ $- =~ i ]]; then
    tmux attach-session -t ssh || tmux new-session -s ssh
    exit
fi
7
répondu moneytoo 2018-04-02 20:31:00

Connexion:

ssh user@host -t "tmux new-session -s user || tmux attach-session -t user"

pendant la session:

Utiliser Ctrl+dterminer la session (la fenêtre tmux se ferme) ou Ctrl+b dtemporaire détacher à partir de session et de vous connecter à nouveau plus tard.

n'oubliez pas! si votre serveur redémarre session perdue!

Lorsque vous êtes à l'intérieur de tmux tout moment, vous pouvez utiliser Ctrl+b s voir sessions liste et passer le courant à un autre.

réparez votre .bashrc:

je vous recommande de définir la fonction universelle dans votre .bashrc:

function tmux-connect {
    TERM=xterm-256color ssh -p ${3:-22} @ -t "tmux new-session -s  || tmux attach-session -t "
}

22 port par défaut. Définissez vos alias fast-connect aussi:

alias office-server='tmux-connect $USER 192.168.1.123'
alias cloud-server='tmux-connect root my.remote.vps.server.com 49281'

connexion sans mot de passe:

et si vous ne voulez pas taper mot de passe à chaque fois que générer .ssh touches connexion automatiquement:

ssh-keygen -t rsa
eval "$(ssh-agent -s)" && ssh-add ~/.ssh/id_rsa

Mettez votre clé publique de l'hôte distant:

ssh-copy-id -p <port> user@hostname

conseils Supplémentaires:

si vous voulez utiliser session temporaire-id qui correspond à une session locale de bash utilisée comme tmux id:

SID=$USER-$BASHPID
ssh user@host -t "tmux new-session -s $SID || tmux attach-session -t $SID"
6
répondu DenisKolodin 2017-03-12 18:31:55

byobu est un joli wrapper utile pour tmux / screen. Se connecte à une session existante ou en crée une nouvelle.

je l'utilise avec autosh qui reconnecte gracieusement la session ssh. Fortement recommandé en cas de problèmes de connectivité intermittente.

function ssh-tmux(){
  if ! command -v autossh &> /dev/null; then echo "Install autossh"; fi
  autossh -M 0 $* -t 'byobu || {echo "Install byobu-tmux on server..."} && bash'
}
1
répondu Sandeep 2016-03-22 23:42:08

vous pourriez trouver cela utile-utilise ssh dans une boucle et se reconnecte ou se connecte à une session tmux existante de sorte que vous avez un facile facile fiable moyen de se reconnecter après une panne de réseau

#!/bin/bash
#
# reconnect to or spawn a new tmux session on the remote host via ssh.
# If the network connection is lost, ssh will reconnect after a small
# delay.
#

SSH_HOSTNAME=
TMUX_NAME=
PORT=

if [[ "$PORT" != "" ]]
then
    PORT="-p $PORT"
fi

if [ "$TMUX_NAME" = "" ]
then
    SSH_UNIQUE_ID_FILE="/tmp/.ssh-UNIQUE_ID.$LOGNAME"

    if [ -f $SSH_UNIQUE_ID_FILE ]
    then
        TMUX_NAME=`cat $SSH_UNIQUE_ID_FILE`
        TMUX_NAME=`expr $TMUX_NAME + $RANDOM % 100`
    else
        TMUX_NAME=`expr $RANDOM % 1024`
    fi

    echo $TMUX_NAME > $SSH_UNIQUE_ID_FILE

    TMUX_NAME="id$TMUX_NAME"
fi

echo Connecting to tmux $TMUX_NAME on hostname $SSH_HOSTNAME

SLEEP=0
while true; do

    ssh $PORT -o TCPKeepAlive=no -o ServerAliveInterval=15 -Y -X -C -t -o BatchMode=yes $SSH_HOSTNAME "tmux attach-session -t $TMUX_NAME || tmux -2 -u new-session -s $TMUX_NAME"
    SLEEP=10
    if [ $SLEEP -gt 0 ]
    then
        echo Reconnecting to session $TMUX_NAME on hostname $SSH_HOSTNAME in $SLEEP seconds
        sleep $SLEEP
    fi
done
1
répondu Neil McGill 2018-04-28 20:50:46