Comment envoyer des commandes lors de l'ouverture d'une session tmux dans une autre session tmux?


136

Une situation typique peut être:

$ tmux
  [0] $ ssh example.com
      $ tmux attach
        [0] $ 

J'ouvre une session tmux, puis ssh dans un serveur et j'attache à une session tmux existante. À ce stade, j'ai une session tmux dans une autre. Comment envoyer des commandes à la session tmux interne?

Remarque: les deux sessions tmux ont les mêmes raccourcis clavier.


4
pas une question de programmation. Veuillez essayer superuser.com . Bonne chance.
shellter

1
Je suis heureux de demander que la question soit déplacée, mais pour le contexte, j'utilise vim à l'intérieur de tmux pour coder et bien sûr je dois souvent ssh vers d'autres serveurs, ce qui est là où ce problème se produit.
Kris

Réponses:


207

La send-prefixcommande peut être utilisée pour envoyer votre frappe de préfixe au (processus en cours d'exécution dans) le volet actif. Par défaut, le préfixe est Cb et Cb est lié à send-prefix(de sorte que le frapper deux fois envoie un seul Cb au volet actif). C'est exactement ce dont nous avons besoin pour accéder aux liaisons de l' instance tmux interne .

Le premier Cb est capturé par l' instance tmux «externe» comme sa clé de préfixe. Le second est capturé par l' instance tmux «externe» et déclenche sa liaison Cb ( send-prefix). Cela envoie un Cb au volet actif de l'instance externe. Le processus en cours d'exécution dans ce volet est (finalement, via une instance ssh ) l' instance tmux «interne» . Il capture le Cb comme sa clé de préfixe. Maintenant, votre prochaine frappe sera passée à travers l' instance tmux externe et capturée par l'instance interne pour déclencher une liaison.

Pour déclencher la liaison c ( new-window) dans une instance de deuxième niveau de tmux , vous devez taper Cb Cb c . Pour une instance de troisième niveau de tmux , tapez Cb Cb Cb Cb c .

Ce doublement pour chaque niveau peut être ennuyeux si vous avez souvent affaire à plusieurs couches de tmux . Si vous pouvez épargner une autre clé, vous pouvez créer une liaison non préfixée pour rendre les choses (éventuellement) plus faciles à taper:

bind-key -n C-\ send-prefix
bind-key -n C-^ send-prefix \; send-prefix

Créer une nouvelle fenêtre dans le tmux de deuxième niveau : C- \ c
Créer une nouvelle fenêtre dans le tmux de troisième niveau : C- ^ c (ou C- \ C- \ c )


Si vous avez un nombre limité de commandes tmux que vous souhaitez envoyer (facilement) aux instances tmux de niveau inférieur , vous pouvez plutôt utiliser send-keyspour créer des liaisons spécifiques (peut-être juste dans votre instance tmux de niveau supérieur ):

bind-key C-c  send-keys C-b c
bind-key C    send-keys C-b C-b c

Créer une nouvelle fenêtre dans tmux de deuxième niveau : Cb Cc
Créer une nouvelle fenêtre dans tmux de troisième niveau : Cb C


De plus , je devais commenter mon existant last-windowcomme il a été appelé contraignant lorsque vous faites C-a C-a, en tant que tel: #bind-key C-a last-window. Notez que mon préfixe n'est apas la valeur par défaut b.
Kris

1
bind-key -n C-\ send-prefixne marche pas. Mon tmux ne reconnaît pas le \. Quand j'utilise une lettre, ça marche.
darksky

@Darksky: Quelle version de tmux utilisez-vous? Cela fonctionne pour moi avec 1.7, 1.6 et 1.5. Vous devrez certainement ajouter un niveau supplémentaire de guillemets si vous effectuez la liaison à partir d'une commande shell (ie tmux bind-key -n 'C-\' send-prefix); si vous rencontrez des problèmes pour le faire fonctionner ~/.tmux.conf(ou une :ligne de commande Prefix ), alors vous pouvez essayer des citations similaires (ie bind-key -n 'C-\' send-prefix).
Chris Johnsen

51

Pour accéder à l'intérieur, maintenez le contrôle et appuyez deux fois sur B.


7

ÉDITER:

Je ne recommande PAS l' utilisation C-qcomme clé de liaison, car il s'agit d'une commande de touche de contrôle par défaut pour

dé-fige l'écran et laisse l'affichage de l'écran continuer

Une situation se produit ici , et @Paschalis fournit une solution:

s'il s'avère être deux fois malchanceux (une session tmux distante avec Cq comme préfixe): Tapez Cltr-q, puis :, et entrez dans tmux:send-keys C-q

Ci-dessous, la réponse:


Pour simplifier, ajoutez la ligne ci-dessous dans votre ~/.tmux.conf

bind-key -n C-q send-prefix

Ensuite, vous pouvez directement utiliser C-qcomme clé de liaison pour votre tmux distant.


si quelqu'un a changé la clé de classeur par défaut dans le tmux externe, alors doit utiliser la même clé de classeur par défaut dans le tmux interne, pour que l'extrait ci-dessus fonctionne!
Paschalis

Je modifie le préfixe de mon tmux local (à Ctrl +] dans mon cas) afin que tous les tmux-es "internes" sur les serveurs aient une liaison par défaut pour le préfixe
action
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.