de Alexey Samoshkin

Tmux în practică: sesiuni tmux locale și imbricate la distanță

Discutăm despre funcțiile tmux, relevanța lor pentru scenarii locale și la distanță și despre modul de configurare și configurare a tmux pentru a sprijini sesiunile imbricate

Aceasta este prima parte a mea tmux în practică serie de articole. Este vorba despre utilizarea și configurarea tmux v2, utilizarea sesiunilor tmux locale și la distanță și cum să susțineți un scenariu atunci când o sesiune tmux la distanță va fi cuibărită într-o sesiune tmux locală.

Înainte de a începe să citiți, iată un exemplu de lucru de la mașina mea. Avem o sesiune tmux locală pe OSX în iTerm2 (rulează în modul ecran complet). Sesiunea locală are 2 ferestre: „zsh” și „nod”.

Fereastra „zsh” este împărțită în 2 panouri: în ambele panouri am trimis SSH către gazdele de la distanță (CentOS7 și Ubuntu14) și sări în sesiuni tmux la distanță acolo.

Panoul inferior cu sesiunea de la distanță Ubuntu14 este împărțit în continuare în 2 panouri și avem 3 ferestre: shell, mon și jurnale.

Tmux in practica sesiuni tmux locale si imbricate la distanta
Sesiunile la distanță tmux imbricate coexistă fericit chiar și în panouri side-by-side în sesiunea tmux locală

Dacă sunteți curios cum funcționează toate împreună, continuați să citiți.

Caracteristici

Mai întâi să trecem rapid prin caracteristicile și avantajele tmux, pentru a înțelege relevanța lor pentru scenarii locale sau la distanță. Ar trebui să ne clarificăm pentru noi înșine de ce avem nevoie de acest lucru „imbricat tmux în tmux”, deoarece la prima vedere pare destul de nebunesc.

  1. Multiplexarea terminalelor, numită ferestre, împarte fereastra în mai multe panouri. Acest lucru are mai mult sens pentru mediul local, atunci când decideți să vă supraîncărcați emulatorul terminal, care altfel nu acceptă caracteristicile menționate mai sus. De exemplu, iTerm sau Terminator sunt deja capabili să multiplexeze un terminal.
  2. Configurați și începeți sesiunea tmux cu un set de ferestre și panouri preconfigurat, dispunerea lor și comenzile rulează în evitați confuzia de a le configura în mod repetat din nou și din nou de la zero. De exemplu:
    – sesiunea „dev”, care include fereastra „# 1: shell” cu 2 panouri pentru utilizare ad-hoc
    – Fereastra „# 2: monitorizare” cu htop și sysdig geamuri
    – Fereastra „# 3: jurnal” cu journalctl și tail -f app.log geamuri
    – Fereastra „# 4: nod” rulează node Server
    tmux vă permite să scrieți script pentru a realiza acest lucru și, dacă preferați abordarea asemănătoare configurării, aruncați o privire tmuxinator. Acest lucru este relevant atât pentru scenariul local, cât și pentru cel de la distanță.
  3. Persistați starea de lucru, astfel încât să puteți detașa și relua mai târziu cu aceeași stare în care ați plecat. Când lucrați local cu mai multe proiecte, puteți configura mai multe sesiuni tmux per proiect și puteți schimba contextul cu ușurință
    Pe aparatul de la distanță, vă puteți detașa de sesiune până la sfârșitul unei zile lucrătoare și puteți reveni la aceeași sesiune de acasă seara.
  4. Supraviețuiți căderilor bruste de conexiune Aceasta este una dintre cele mai importante caracteristici. Să presupunem că sunteți SSH pe gazdă la distanță și că aveți un proces de lungă durată acolo. Dacă se pierde conexiunea SSH sau se produce o cădere fizică a rețelei, semnalul SIGHUP va fi trimis către shell-ul la distanță și acesta și toate procesele sale secundare vor fi încheiate. Tmux face ca procesele dvs. la distanță să fie rezistente la astfel de riscuri.

Caracteristicile mai puțin importante, dar care merită menționate sunt următoarele:

  1. Odată ce ați configurat mediul tmux, sunteți mai puțin dependent de emulatorul de terminal părinte și de setul său unic de caracteristici, și poate trece la un alt terminal emulator va mai puțin hassle. Având în vedere că sunt un utilizator iTerm2 pe OSX, pot migra către Terminator sau console pe Linux instalând configurația mea tmux acolo și să obțin același mediu cunoscut cu care sunt obișnuit deja.
  2. Distribuiți sesiunea la distanță cu colegul, pentru a putea colabora în timp real. Cred că este de rar folos într-o lume reală, dar sună mișto. Da, programează perechea și alte cuvinte interesante. ?

Deci, pentru a încheia, tmux este responsabil pentru două lucruri principale:

  1. Multiplexare terminală, gestionare sesiune / fereastră / panou
  2. Persistați starea sesiunii și supraviețuiți deconectărilor pentru scenarii la distanță

Unde tmux strălucește cu adevărat este (2). În ceea ce privește (1), unii oameni se ceartă, că tmux rupe filosofia Unix, deoarece încearcă să facă 2 lucruri, în loc să facă una și să o facă bine și că (1) nu ar trebui să fie o responsabilitate tmux.

Sesiuni locale și la distanță imbricate

Deci, având în vedere toate acestea, unii oameni preferă să folosească tmux pe mașina locală doar deasupra emulatorului terminalului, supraîncărcându-l cu multiplexare și gestionarea ferestrelor. Oamenii care și-au petrecut cea mai mare parte a timpului SSH-uri pe gazde la distanță, folosesc natura sesiunii persistente și rezistența la deconectarea rețelei.

Dar cazurile locale și la distanță trebuie să se excludă reciproc? Pot să le combin? Da, este legal să SSH la o gazdă la distanță și să începeți sesiunea tmux acolo, în timp ce vă aflați deja într-un mediu tmux local.

Aceasta se numește sesiuni imbricate, dar vine cu câteva obstacole:

În primul rând, vă confruntați cu întrebarea: Cum puteți controla sesiunile interioare, deoarece toate legăturile de taste sunt capturate și gestionate de sesiunile externe?

Cea mai comună soluție este să apăsați prefix de două ori (prefixul este o legare de taste care pune tmux într-un mod de comandă, de obicei este C-b, dar unii oameni preferă o remapare la ecranC-a). Primul prefix este apăsat de sesiunea exterioară, în timp ce al doilea este trecut la sesiunea interioară. Nu sunt necesari pași suplimentari, iar acest lucru funcționează din cutie.

Cu toate acestea, legăturile de taste root – cele care sunt ascultate la nivel global, nu în modul de comandă – sunt încă capturate doar de sesiunea exterioară. Și mi s-a părut foarte enervant să apăs dublu prefix. Pentru mine este chiar enervant să-l apăs o dată, în iTerm2 nu există modul de comandă și doar apăs pe „⌘⌥→”Pentru a selecta panoul din dreapta, în loc să trimiteți două apăsări de taste separate C-a RightArrow.

O altă soluție este să configurați 2 prefixe individuale, de exemplu, C-b pentru o sesiune locală, în timp ce C-a pentru unul îndepărtat. Cu configurația de mai jos, înseamnă că apăsând C-a local ar trimite prefixul implicit C-b la sesiunea la distanță. Am găsit această soluție Aici.

set -g prefix C-bbind-key -n C-a send-prefix

Dar chiar se simte ca:

Tmux in practica sesiuni tmux locale si imbricate la distanta

Soluția mai bună ar fi utilizarea aceleiași tabele de taste atât pentru sesiunile locale, cât și pentru sesiunile la distanță – fără prefixuri separate sau apăsarea dublă a prefixului – și dezactivarea tuturor legăturilor de taste și gestionarea prefixurilor în sesiunea exterioară, atunci când se lucrează cu una interioară. credite și asta Problema Github.

Deci, când voi lucra în sesiunea interioară, doar apăs F12 și comutați OFF mod în sesiunea exterioară. Când se întâmplă acest lucru, sesiunea exterioară afișează OFF indicator vizual în linia de stare și modifică stilul vizual al liniei de stare pentru a sublinia în continuare că sesiunea este în modul OFF.

Aici este Gist din munca mea configurația tmux, pe care l-am creat recent (sunt incluse doar piesele relevante):

Practic, configurăm F12 legarea tastelor pentru tabelul de chei rădăcină. Când este apăsat, setăm prefixul la None, comutați tabelul de taste curent la off, apoi modificați stilurile liniei de stare și forțați tmux să reîmprospăteze linia de stare. Se face un pas suplimentar pentru a anula modul de copiere al panoului curent, dacă acesta este prezent. De îndată ce am trecut la off pentru tabelul de chei și oprirea gestionării prefixurilor, sesiunea exterioară nu ascultă deloc apăsările de tastă. Toate apăsările de taste sunt transmise la sesiunea interioară fără a fi interceptate de cea exterioară.

Totul este minunat, dar trebuie cumva să ne întoarcem și să redăm sesiunea exterioară înapoi în modul normal de lucru. De aceea, configurăm o singură legare de taste F12 în tabelul cheilor off, care revine efectul inițialei F12 apăsați tasta.

De asemenea, configurăm un indicator vizual pentru linia de stare, care arată când este tabelul cu chei curent off, și se ascunde altfel.

În concluzie, având în vedere această configurație, puteți configura o singură sesiune locală cu 1 fereastră cu 2 panouri care conține sesiuni la distanță imbricate pe diferite gazde (a se vedea imaginea de la începutul postării).

Configurare sesiune specifică de la distanță

În exemplul anterior s-ar putea să observați că linia de stare a sesiunii exterioare este poziționată în partea de sus, unde sesiunea interioară are linia de stare în partea de jos. Aceasta oferă o distincție vizuală frumoasă și nu face ca liniile de stare să se stiveze una peste alta.

Dar cum este posibil să se aplice diferite configurații bazate pe condiționare?

Ei bine, este destul de ușor. Putem detecta dacă sesiunea este la distanță sau locală prin existența SSH_CLIENT variabilă de mediu.

if-shell 'test -n "$SSH_CLIENT"'    'source-file ~/.tmux/tmux.remote.conf'

Si ~/.tmux/tmux.remote.conf fișierul conține configurația care va fi aplicată numai sesiunii la distanță. Acolo schimbăm poziția liniei de stare și eliminăm unele widget-uri din ea (cum ar fi ceasul și bateria), deoarece acestea replică aceleași widget-uri din sesiunea locală.

Deci asta este. Dacă doriți să vedeți toate acestea în acțiune, verificați-mi tmux-config repertoriu.

tmux / tmux: cod sursă tmux – https://github.com/tmux/tmux

Utilizarea Tmux de la distanță în cadrul unei sesiuni Tmux locale | Pur și simplu Ian – https://simplyian.com/2014/03/29/using-tmux-remotely-within-a-local-tmux-session/

TMux imbricat – http://stahlke.org/dan/tmux-nested/

activează / dezactivează toate legăturile de taste · Problema nr. 237 · tmux / tmux – https://github.com/tmux/tmux/issues/237

samoshkin / tmux-config: configurație Tmux, care vă supraîncarcă tmux-ul pentru a crea un mediu terminal confortabil și răcoros – https://github.com/samoshkin/tmux-config