Вопрос или проблема
Я открыл сессию tmux на своем локальном компьютере и подключился по ssh к удаленному компьютеру. После этого я ввел tmux attach
на удаленной машине, и у меня открылось удаленное tmux-сессия в моей локальной tmux-сессии.
Теперь я хочу отвязаться от удаленной tmux-сессии, я пробовал CTRL+B D, но это отвязало мою локальную tmux-сессию, а не удаленную.
Как я могу отвязаться от удаленной tmux-сессии?
CTRL+B CTRL+B D
(предполагая, что используются стандартные привязки)
Первый CTRL+B интерпретируется вашим локальным tmux (поскольку он первым видит все ваши нажатия клавиш). Второй CTRL+B — это команда, которая заставляет ваш локальный tmux отправить CTRL+B в его активную панель; сгенерированный CTRL+B попадает в удаленный tmux. D проходит через локальный tmux без изменений; когда он доходит до удаленного tmux, он запускает команду detach
.
- Вы вводите CTRL+B.
Ваш локальный tmux интерпретирует это как ключ префикса; ничего не отправляется процессам, запущенным под локальным tmux. - Вы вводите CTRL+B.
Ваш локальный tmux привязывает его к командеsend-prefix
.- Ваш локальный tmux отправляет CTRL+B процессу, запущенному в активной панели (ssh).
- ssh пересылает его (через sshd и т. д.) процессу, работающему на удаленной стороне (удаленный tmux).
Ваш удаленный tmux интерпретирует это как ключ префикса; ничего не отправляется процессам, запущенным под удаленным tmux.
- Вы вводите D.
Ваш локальный tmux пропускает это нормально (поскольку второй CTRL+B завершил полную последовательность командных клавиш для локального tmux).
Ваш удаленный tmux привязывает это кdetach-client
; он отвязывает активного клиента.
Это то же самое, что и когда вам нужно отправить CTRL+B в любую программу, работающую внутри сессии tmux. Если вы хотите отправить CTRL+B в вашу обычную оболочку (например, потому что ваша оболочка использует редактирование в стиле Emacs, где CTRL+B — это backward-char
(и вам не нравится использовать клавиши стрелок)), вам нужно будет использовать CTRL+B CTRL+B, чтобы отправить одну CTRL+B в оболочку.
Другой способ сделать это, не беспокоясь о привязках клавиш, — ввести tmux detach
в удаленной tmux-сессии.
Я пробовал первый ответ без успеха.
Мне удалось получить желаемый результат, сделав следующее:
tmux attach
Я вошел в tmux и увидел, что другая сессия все еще была прикреплена.
Поэтому я отвязал свою текущую сессию, чтобы вернуться к оболочке: CTRL+B D
Затем я выполнил следующую команду:
tmux attach -d
Это говорит о том, чтобы присоединиться к стандартной сессии и отвязать все другие сессии, которые в данный момент прикреплены. См. страницу man в разделе Клиенты и Сессии
attach-session [-dr] [-t target-session]
(псевдоним: attach)
Если выполнять вне tmux, создайте нового клиента в текущем терминале и присоедините его к
target-session. Если используется изнутри, переключите текущий клиент. Если указан -d, все другие
клиенты, прикрепленные к сессии, будут отвязаны. -r обозначает, что клиент только для чтения (только клавиши, привязанные к команде detach-client, имеют какое-либо влияние)
Если вы хотите попробовать другой вариант, выполните следующие шаги:
- Отвяжите текущую tmux-сессию с помощью CTRL+B D. Таким образом, вы перейдете к командной строке нормального терминала.
- Выполните
tmux ls
. Найдите сессию, которая в данный момент прикреплена. - Выполните эту команду, чтобы отвязать уже прикрепленную сессию:
tmux detach-client -s <attached_session_name>
Я предпочитаю tmux detach
, это не требует клавиатуры, поскольку это команда.
Если вы изменили свою конфигурацию tmux, чтобы использовать что-то другое, чем Ctrl+b
в обеих сессиях tmux, вам все равно нужно будет нажать Ctrl+b
во второй раз.
Например, моя привязка — это Ctrl-/
в обеих сессиях tmux, поэтому я нажимаю:
C-/ C-b d
Вы можете использовать CTRL+B D для отвязывания и CTRL+B S для просмотра всех сессий, CTRL+B C для открытия sессии tmux внутри сессии tmux
Скажем, вы подключаетесь по ssh к машине с прикрепленной сессией tmux
Итак, с MAC на raspberry pi с запущенной сессией TMUX
robins-Mac-mini:~ robin$ ssh 192.168.0.22
[email protected]'s password:
Linux CANMONRPI4 6.1.77-v8+ #1730 SMP PREEMPT Чт Фев 8 15:26:11 GMT 2024 aarch64
Программы, включенные в систему Debian GNU/Linux, являются бесплатным программным обеспечением;
точные условия распространения для каждой программы описаны в
отдельных файлах в /usr/share/doc/*/copyright.
Debian GNU/Linux поставляется без каких-либо гарантий, в той степени,
разрешенной применимым правом.
Последний вход: Сб Дек 14 11:57:47 2024 от 192.168.0.190
robin@CANMONRPI4:~ $ tmux ls
0: 2 окна (создано Пт Дек 13 15:31:23 2024) (прикреплено)
1: 1 окно (создано Пт Дек 13 15:34:31 2024)
2: 1 окно (создано Пт Дек 13 15:34:40 2024)
3: 1 окно (создано Пт Дек 13 15:43:53 2024)
4: 1 окно (создано Пт Дек 13 16:36:14 2024)
И вы хотите взять сессию под контроль, вы
просто выполните
tmux attach -t 0
и теперь у вас есть контроль над сессией tmux!
Ответ или решение
Чтобы отсоединить сессию tmux, которая уже находится внутри другой сессии tmux, необходимо учитывать несколько важных моментов. Это распространенная ситуация, когда пользователи ssh-подключаются к удаленному серверу и запускают tmux внутри уже активной сессии tmux на локальной машине. В этом ответе мы рассмотрим несколько способов эффективно решить эту задачу.
Понимание структуры TMUX
tmux является мощным инструментом для управления терминальными сеансами, который позволяет пользователям создавать и управлять несколькими терминальными окнами через одну консоль. Однако, когда вы работаете с вложенными сессиями tmux, важно понять, как обрабатывать команды так, чтобы они направлялись в правильный уровень tmux.
Стандартные клавиатурные команды
При работе с tmux по умолчанию используется комбинация клавиш Ctrl+b
как префикс для выполнения команд. Однако, если вы находитесь в сессии tmux на удаленном сервере, вам нужно будет использовать комбинацию клавиш Ctrl+b
дважды для корректной маршрутизации команд.
- Первый
Ctrl+b
: интерпретируется вашим локальным tmux. - Второй
Ctrl+b
: отправляется в удаленный tmux, позволяя ему понять, что вы хотите выполнить команду, связанную с tmux. - Команда
d
(detach): теперь передается в удаленный экземпляр tmux и вызывает отключение от сессии.
Таким образом, чтобы отсоединиться от удаленного tmux, используйте следующую последовательность клавиш:
Ctrl+b
, затем Ctrl+b
, и затем d
.
Альтернативные способы отключения
1. Использование команды через терминал:
Вы можете просто ввести команду tmux detach
в сессии tmux на удаленке. Это надежный метод, который не требует запоминания комбинаций клавиш и будет работать независимо от настроек клавиатурных сокращений. Он отредактирует текущую сессию и отключит вас, оставив работу остальных клиентов сессии нетронутой.
2. Отключение всех клиентов из одной сессии:
Если ваша цель состоит в том, чтобы взять на себя управление сессией, можно выполнить команду tmux attach -d
, что приведет к отсоединению всех клиентов, подключенных к целевой сессии. Эта команда полезна, если сессия уже занята другим пользователем, и вы хотите занять её.
3. Использование команд для управления клиентами:
Для удобства управляйте сессиями и клиентами с помощью команды tmux ls
, которая отображает список всех текущих сессий. После этого можно используя команду: tmux detach-client -s <session_name>
отключить конкретно указанную сессию.
Заключение
Понимание того, как правильно направлять команды в tmux при работе с вложенными сеансами, позволяет избежать путаницы и эффективно управлять вашими сессиями. Используйте представленные методы в зависимости от ваших нужд и предпочтений, чтобы управлять вашими сеансами tmux как на локальном, так и на удаленном уровне.
Использование tmux открывает множество возможностей для управления и организации ваших рабочих процессов в терминале. Если возникнут дополнительные вопросы или вам потребуется помощь, не стесняйтесь обращаться за поддержкой.