Tmux عمليًا: جلسات tmux عن بُعد محلية ومتداخلة

نناقش ميزات tmux وأهميتها للسيناريوهات المحلية والبعيدة وكيفية إعداد وتهيئة tmux لدعم الجلسات المتداخلة

هذا هو الجزء الأول من سلسلة مقالات tmux الخاصة بي. يتعلق الأمر باستخدام وتكوين tmux v2 ، واستخدام جلسات tmux المحلية والبعيدة ، وكيفية دعم سيناريو عندما يتم دمج جلسة tmux عن بُعد داخل جلسة tmux محلية.

قبل أن تبدأ القراءة ، إليك مثال عملي من جهازي. لدينا جلسة tmux محلية على OSX داخل iTerm2 (تعمل في وضع ملء الشاشة). تحتوي الجلسة المحلية على نافذتين: "zsh" و "node".

يتم تقسيم نافذة "zsh" إلى جزأين: في كلا الجزأين قمنا بربط المضيفين البعيدين (CentOS7 و Ubuntu14) والانتقال إلى جلسات tmux البعيدة هناك.

تم تقسيم الجزء السفلي مع جلسة Ubuntu14 البعيدة إلى جزأين ، ولدينا 3 نوافذ: shell و mon و logs.

إذا كنت مهتمًا بكيفية عمل كل ذلك معًا ، فاستمر في القراءة.

المميزات

أولاً ، دعنا ننتقل بسرعة إلى ميزات ومزايا tmux ، لفهم مدى ملاءمتها للسيناريوهات المحلية أو البعيدة. يجب أن نوضح لأنفسنا لماذا نحتاج إلى هذا الشيء "tmux in tmux" ، لأنه للوهلة الأولى يبدو مجنونًا جدًا.

  1. تعدد الإرسال الطرفي ، النوافذ المسماة ، تقسيم النافذة إلى عدة أجزاء. هذا أكثر منطقية بالنسبة للبيئة المحلية ، عندما تقرر زيادة شحن المحاكي الطرفي الخاص بك ، والذي بخلاف ذلك لا يدعم الميزات المذكورة أعلاه. على سبيل المثال ، iTerm أو Terminator قادران بالفعل على مضاعفة محطة طرفية.
  2. قم بإعداد جلسة tmux وابدأها مع مجموعة مُعدة مسبقًا من النوافذ والألواح ، ويتم ترتيبها وأوامرها في الداخل لتجنب متاعب إعدادها مرارًا وتكرارًا من البداية. فمثلا:

    - جلسة "dev" ، والتي تتضمن نافذة "# 1: shell" مع جزأين للاستخدام المخصص

    - "# 2: الرصد" نافذة مع htopو sysdigألواح

    - "# 3: سجل" نافذة مع journalctlو tail -f app.logألواح

    - نافذة "# 4: عقدة" تقوم بتشغيل nodeالخادم

    يتيح لك tmux كتابة برنامج نصي لتحقيق ذلك ، وإذا كنت تفضل أسلوب التكوين ، فقم بإلقاء نظرة على tmuxinator. هذا مناسب لكل من السيناريو المحلي والبعيد.

  3. استمر في حالة عملك ، حتى تتمكن من الفصل والاستئناف لاحقًا بنفس الحالة التي تركتها. عند العمل محليًا مع العديد من المشاريع ، يمكنك إعداد عدة جلسات tmux لكل مشروع وتبديل السياق بسهولة

    في الجهاز البعيد ، يمكنك فصل الجلسة بنهاية يوم العمل والعودة إلى نفس الجلسة من المنزل في المساء.

  4. البقاء على قيد الحياة انقطاع الاتصال المفاجئ. هذه واحدة من أهم الميزات. لنفترض أنك SSH على مضيف بعيد ، ولديك عملية طويلة هناك. إذا فُقد اتصال SSH أو حدث انقطاع فعلي للشبكة ، فسيتم إرسال إشارة SIGHUP إلى shell البعيد ، وسيتم إنهاءها وجميع العمليات التابعة لها. يجعل Tmux عملياتك البعيدة مقاومة لمثل هذه المخاطر.

الميزات الأقل أهمية ، ولكن لا تزال تستحق الذكر هي كما يلي:

  1. بمجرد أن تقوم بإعداد بيئة tmux ، فأنت أقل اعتمادًا على محاكي المحطة الطرفية الأصلي ومجموعة ميزاته الفريدة ، ويمكنك التبديل إلى محاكي طرفي آخر سيقلل من المتاعب. نظرًا لأنني مستخدم iTerm2 على OSX ، يمكنني الانتقال إلى Terminator أو konsole على Linux عن طريق تثبيت تكوين tmux الخاص بي هناك ، والحصول على نفس البيئة المعروفة التي اعتدت عليها بالفعل.
  2. شارك جلستك البعيدة مع زميلك ، حتى تتمكن من التعاون في الوقت الفعلي. أعتقد أنه نادر الاستخدام في العالم الحقيقي ، لكنه يبدو رائعًا. نعم ، البرمجة الزوجية ، وغيرها من الكلمات الطنانة الرائعة. ؟

لذلك ، في الختام ، فإن tmux مسؤول عن شيئين رئيسيين :

  1. مضاعفة المحطة الطرفية ، إدارة الجلسة / النافذة / اللوحة
  2. استمر في حالة الجلسة وتجنب قطع الاتصال للسيناريوهات البعيدة

حيث يضيء tmux حقًا هو (2). فيما يتعلق بـ (1) ، يجادل بعض الناس ، أن tmux يكسر فلسفة Unix ، لأنه يحاول القيام بأمرين ، بدلاً من القيام بأحدهما والقيام به بشكل جيد ، وهذا (1) لا ينبغي أن يكون مسؤولية tmux.

جلسات محلية وبعيدة متداخلة

لذلك ، بالنظر إلى كل ذلك ، يفضل بعض الأشخاص استخدام tmux على الجهاز المحلي فقط أعلى المحاكي الطرفي الخاص بهم ، مما يؤدي إلى شحنه بشكل كبير من خلال تعدد الإرسال وإدارة النوافذ في المقام الأول. الأشخاص الذين قضوا معظم وقتهم في SSH على مضيفين عن بعد ، يستفيدون من طبيعة الجلسات المستمرة ومقاومة قطع الاتصال بالشبكة.

ولكن هل يجب أن تكون القضايا المحلية والنائية متعارضة؟ هل يمكنني الجمع بينهما؟ نعم ، من القانوني أن تقوم SSH بمضيف بعيد وبدء جلسة tmux هناك ، بينما تكون بالفعل في بيئة tmux محليًا.

يُسمى هذا بالجلسات المتداخلة ، ولكنه يأتي مع بعض العقبات:

بادئ ذي بدء ، تواجه السؤال: كيف يمكنك التحكم في الجلسات الداخلية ، نظرًا لأن جميع روابط المفاتيح يتم التقاطها والتعامل معها بواسطة جلسات خارجية؟

الحل الأكثر شيوعًا هو الضغط prefixمرتين (البادئة عبارة عن رابط مفتاح يضع tmux في وضع الأوامر ، عادةً ما يكون كذلك C-b، لكن بعض الأشخاص يفضلون إعادة تعيينه إلى شاشة تشبه الشاشة C-a). يتم الإمساك بضغطة مفتاح البادئة الأولى بالجلسة الخارجية ، بينما يتم تمرير الضغط الثاني إلى الجلسة الداخلية. لا توجد خطوات إضافية يجب القيام بها ، وهذا يعمل خارج الصندوق.

ومع ذلك ، فإن ارتباطات مفاتيح الجذر - تلك التي يتم الاستماع إليها عالميًا ، وليس في وضع الأوامر - لا تزال عالقة في الجلسة الخارجية فقط. ووجدت أنه من المزعج حقًا الضغط المزدوج prefix. بالنسبة لي ، من المزعج الضغط عليه مرة واحدة ، في iTerm2 لا يوجد شيء مثل وضع الأوامر ، وأنا فقط أضغط على " ⌘⌥→" لتحديد الجزء الموجود على اليمين ، بدلاً من إرسال ضغطتي مفاتيح منفصلتين C-a RightArrow.

حل آخر هو إعداد بادئتين فرديتين ، على سبيل المثال ، C-bلجلسة محلية ، بينما لجلسة C-aبعيدة. باستخدام التكوين أدناه ، فهذا يعني أن الضغط C-aمحليًا سيرسل بادئة افتراضية C-bإلى الجلسة البعيدة. وجدت هذا الحل هنا.

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

لكنها تشعر حقًا كما يلي:

سيكون الحل الأفضل هو استخدام نفس جدول المفاتيح في الجلسات المحلية والبعيدة - بدون بادئات منفصلة أو بادئة ضغط مزدوجة - وإيقاف تشغيل جميع روابط المفاتيح ومعالجة البادئة في الجلسة الخارجية ، عند العمل مع البادئة الداخلية. الاعتمادات وقضية جيثب هذه.

لذلك ، عندما أذهب للعمل في الجلسة الداخلية ، أضغط F12وأبدّل OFFالوضع في الجلسة الخارجية. عندما يحدث ذلك ، تُظهر الجلسة الخارجية OFFالمؤشر المرئي في خط الحالة وتغير التصميم المرئي لخط الحالة لزيادة التأكيد على أن الجلسة في وضع إيقاف التشغيل.

إليك Gist من تكوين tmux العملي الخاص بي ، والذي صنعته مؤخرًا (تم تضمين القطع ذات الصلة فقط):

في الأساس ، نقوم بإعداد F12رابط المفاتيح لجدول مفتاح الجذر. عند الضغط عليه ، نقوم بتعيين البادئة على None، وتبديل جدول المفاتيح الحالي إلى off، ثم تغيير أنماط سطر الحالة ، وإجبار tmux على تحديث سطر الحالة. يتم اتخاذ خطوة إضافية لإلغاء وضع نسخ الجزء الحالي ، إذا كان موجودًا. بمجرد أن انتقلنا إلى offجدول المفاتيح وقمنا بإيقاف تشغيل معالجة البادئة ، فإن الجلسة الخارجية لا تستمع لأي ضغطات مفاتيح على الإطلاق. يتم تمرير جميع ضغطات المفاتيح إلى الجلسة الداخلية دون أن تعترضها الضغطة الخارجية.

كل هذا رائع ، لكننا نحتاج بطريقة ما للعودة وإعادة الجلسة الخارجية إلى وضع العمل العادي. لهذا السبب قمنا بإعداد رابط مفتاح واحد F12في جدول المفاتيح off، والذي يعكس تأثير F12الضغط الأولي على المفتاح.

أيضًا ، نقوم بتكوين مؤشر مرئي لخط الحالة ، والذي يظهر عندما يكون الجدول الرئيسي الحالي off، ويخفي بخلاف ذلك.

في الختام ، بالنظر إلى هذا التكوين ، يمكنك إعداد جلسة محلية واحدة مع نافذة واحدة مع جزأين يحتويان على جلسات عن بعد متداخلة لمضيفين مختلفين (انظر الصورة في بداية المنشور).

تكوين جلسة خاصة عن بعد

في المثال السابق ، قد تلاحظ أن سطر الحالة للجلسة الخارجية يتم وضعه في الأعلى ، حيث يكون خط الحالة للجلسة الداخلية في الأسفل. يوفر ذلك تمييزًا مرئيًا رائعًا ولا يجعل خطوط الحالة مكدسة فوق بعضها البعض.

ولكن كيف يمكن تطبيق تكوينات مختلفة قائمة على أساس شرطي؟

حسنًا ، هذا سهل نوعًا ما. يمكننا اكتشاف ما إذا كانت الجلسة بعيدة أو محلية من خلال وجود SSH_CLIENTمتغير البيئة.

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

و ~/.tmux/tmux.remote.confيحتوي ملف التكوين التي سيتم تطبيقها فقط على جلسة العمل عن بعد. هناك نقوم بتغيير موضع خط الحالة ، وإزالة بعض عناصر واجهة المستخدم منه (مثل الساعة والبطارية) لأنها تقوم فقط بتكرار نفس الأدوات من الجلسة المحلية.

هذا كل شيء. إذا كنت تريد رؤية كل هذا أثناء العمل ، فتحقق من مستودع tmux-config الخاص بي.

الموارد والروابط

tmux / tmux: كود مصدر tmux - //github.com/tmux/tmux

استخدام Tmux عن بُعد ضمن جلسة Tmux المحلية | ببساطة إيان - //simplyian.com/2014/03/29/using-tmux-remotely-within-a-local-tmux-session/

متداخلة tmux - //stahlke.org/dan/tmux-nested/

تبديل تشغيل / إيقاف تشغيل كافة روابط المفاتيح · الإصدار رقم 237 · tmux / tmux - //github.com/tmux/tmux/issues/237

samoshkin / tmux-config: تكوين Tmux ، الذي يشحن tmux الخاص بك لبناء بيئة طرفية مريحة وباردة - //github.com/samoshkin/tmux-config