У меня есть около десяти серверов, к которым я регулярно подключаюсь по SSH. У каждого есть запись в ~/.ssh/config
файле на моем локальном компьютере .
Чтобы не потерять контроль над моим запущенным процессом, когда мое интернет-соединение неизбежно разрывается, я всегда работаю внутри tmux
сеанса. Я хотел бы, чтобы tmux автоматически подключался каждый раз при запуске SSH-соединения, поэтому мне не нужно всегда вводить tmux attach || tmux new
текст после входа в SSH.
К сожалению, это оказалось не так просто, как я изначально надеялся.
- Я не хочу добавлять какие-либо команды
~/.bashrc
на серверы, потому что мне это нужно только для сеансов SSH, а не для локальных сеансов. - Добавление
tmux attach || tmux new
к~/.ssh/rc
на серверах приводит просто ошибкаnot a terminal
броска после подключения, даже еслиRequestTTY force
опция добавляется к строке для этого сервера в моем локальном файле SSH конфигурации.
~/.ssh/config
: большинство из вас, вероятно, ищут не один из первых пяти ответов, а шестой ( stackoverflow.com/a/52838493/5354137 ). С любой достаточно свежейtmux
версией это также самый разумный способ делать что-то.Ответы:
Конфигурация на стороне сервера:
Чтобы автоматически запускать tmux на вашем удаленном сервере при обычном входе в систему через SSH (и только SSH), отредактируйте
~/.bashrc
вашего пользователя или root (или обоих) на удаленном сервере соответственно:Эта команда создает сеанс tmux, который вызывается,
ssh_tmux
если его нет, или повторно подключается к уже существующему сеансу с этим именем. В случае разрыва соединения или если вы забыли сеанс несколько недель назад, каждый вход в систему по SSH автоматически возвращает вас к сеансу tmux-ssh, который вы оставили.Подключитесь от вашего клиента:
Ничего особенного, просто
ssh user@hostname
.источник
ssh_tmux
на$USER
)$SSH_TTY
сравнению$SSH_CONNECTION
тоже.tmux new-session -A -s ssh_tmux
для заменыtmux attach-session -t ssh_tmux || tmux new-session -s ssh_tmux
гораздо более короткие, если немного запутать,-A
говорит tmux присоединить сеанс, если он уже существуетif [[ -n "$PS1" ]] && [[ -z "$TMUX" ]] && [[ -n "$SSH_CONNECTION" ]];
$PS1
, используйте[[ $- == *i* ]]
вместо этого, поскольку PS1 может быть определен, даже если это не интерактивная оболочка.Хорошо, я нашел в основном удовлетворительное решение. В моем локальном
~/.bashrc
я написал функцию:который в основном перезаписывает функцию терминала ssh для вызова встроенной программы ssh с заданными аргументами, за которыми следует
"tmux attach || tmux new"
.(
$@
Обозначает все аргументы, указанные в командной строке, поэтомуssh -p 123 user@hostname
они будут расширены доssh -t -p 123 user@hostname "tmux attach || tmux new"
)(
-t
Аргумент эквивалентенRequestTTY Force
команде tmux и необходим для нее.)источник
tmux
поддерживает его, рассмотрите возможность использованияtmux new -A foo
which,foo
если возможно, будет подключаться к существующему сеансу с именем , создавая его при необходимости. Это позволяет вам упростить вашу функцию до/usr/bin/ssh -t "$@" tmux new -A
(и обязательно цитировать$@
!).function ssht
или что-то подобное, чтобы вы могли продолжать использовать вssh
обычном режиме. В противном случае просто вводите/usr/bin/ssh
в командной строке всякий раз, когда подключаетесь к машине без tmux :)ssht
в него~/bin
.ssh -t user@hostname "LANG=$LANG tmux attach || tmux new"
Подключить:
Во время сеанса:
Используйте
Ctrl+d
для завершения сеанса (окно tmux закрывается) илиCtrl+b d
для временного отключения от сеанса и подключения к нему позже.Когда вы находитесь внутри tmux, вы можете использовать его
Ctrl+b s
для просмотра списка сеансов и переключения текущего на другой.Исправьте свой .bashrc:
Я рекомендую вам определить универсальную функцию в вашем
.bashrc
:По
22
умолчанию он использует порт. Также определите псевдонимы быстрого подключения:Вход без пароля:
И если вы не хотите каждый раз вводить пароль, чем автоматически генерируете
.ssh
ключи для входа в систему :Поместите свой открытый ключ на удаленный хост:
Дополнительные советы:
Если вы хотите использовать временный идентификатор сеанса, который соответствует локальному сеансу bash, используйте его как идентификатор tmux :
источник
||
в некоторых потребительных случаях должна включатьnew-session
в.tmux.conf
и просто всегда использоватьtmux a -t 0
.tmux new-session -A
который будет прикреплен, если он существует, иначе он создаст новый.Я использовал строки из @kingmeffisto (мне не разрешено комментировать этот ответ) и добавил выход, поэтому завершение tmux также завершает соединение ssh. Однако это нарушило сеансы SFTP, поэтому мне пришлось проверить
$SSH_TTY
вместо$SSH_CONNECTION
.РЕДАКТИРОВАТЬ 4/2018: Добавлен тест для интерактивного терминала,
[[ $- =~ i ]]
позволяющий работать с такими инструментами, как Ansible.источник
Как описано в этом сообщении блога, вы можете использовать ssh, а затем подключиться к существующему сеансу tmux с помощью одной команды:
источник
tmux attach || tmux new
чтобы новый сеанс tmux не создавался для каждого соединения). Сложность заключается в том, что это правильная команда,ssh -t user@host tmux attach || tmux new
и единственный способ присвоить псевдониму то, что требует аргумента внутри командной строки, - это создать новую функцию, как я сделал выше.ssh [hostname] -t tmux attach -t [sessionName]
tmux 3.1 или новее¹ на удаленной машине
В свой локальный
~/.ssh/config
введите²:Не связано, но если вы имеете дело с символами, отличными от ASCII, я бы рекомендовал изменить это на
tmux -u …
для явного включения поддержки Unicode даже на машинах, на которых не установлены надлежащие переменные среды.tmux 3.0a или старше на удаленном компьютере
Практически то же самое, что и выше, но измените последнюю строку на ³:
¹ По состоянию на 2020-10-29 список дистрибутивов, поставляемых с tmux 3.1 или новее уже довольно длинный.
²
new
- это сокращение отnew-session
.³
at
- это сокращение отattach-session
.Альтернативный метод с использованием удаленного
authorized_keys
файла:Если
~/.ssh/config
по какой-либо причине вы не хотите иметь файл или хотите, чтобы удаленная машина заставляла подключенную машину подключаться / открывать сеанс, добавьте это на свой пульт~/.ssh/authorized_keys
:Это, конечно, будет работать для всех клиентов, у которых установлен соответствующий закрытый ключ, что может быть либо положительным, либо отрицательным, в зависимости от того, что вы хотите. Существует риск того, что, если что-то пойдет не так, подключение больше не будет.
источник
tmux at
вместоtmux a
? Также было бы разумно использовать для этого именованный сеанс, иначе tmux будет подключаться к "случайным" существующим сеансам после входа на хост.Ctrl+A
Ctrl+Z
.Ctrl-B
D
работает лечить по сравнению сCtrl-B
Ctrl-Z
. Благодарность!byobu - хорошая полезная оболочка для tmux / screen. Подключается к существующему сеансу, если он есть, или создает новый.
Я использую его с autossh, который изящно повторно подключает сеанс ssh. Настоятельно рекомендуется в случае периодических проблем с подключением.
источник
Вы можете найти это полезным - использует ssh в цикле и повторно подключается к существующему сеансу tmux или подключается к нему, чтобы у вас был хороший простой и надежный способ переподключиться после сбоя сети
источник
Это тот, который на самом деле создает отличный пользовательский опыт. Он автоматически запускает tmux всякий раз, когда вы открываете терминал (как физически, так и ssh). Вы можете начать работу на одном устройстве, выйти из терминала и продолжить работу на другом. Если он обнаружит, что кто-то уже подключен к сеансу, он создаст новый сеанс. Ставьте на сервер , в зависимости от вашей оболочки
~/.zshrc
или~/.bashrc
.if [[ -z "$TMUX" ]] ;then ID="$( tmux ls | grep -vm1 attached | cut -d: -f1 )" # get the id of a deattached session if [[ -z "$ID" ]] ;then # if not available attach to a new one tmux new-session else tmux attach-session -t "$ID" # if available attach to it fi fi
источник
Я знаю, что возрождаю старую ветку, но я поработал над решением bashrc и думаю, что от него есть польза:
На данный момент есть ограничение на 10 (11) сеансов - я не хотел убивать свой сервер бесконечным циклом в bashrc. Кажется, он работает довольно надежно, за исключением ошибки tmux сбоя на клиентах списка, если сеанс не существует.
источник
Этот способ позволяет повторно подключиться к старому экземпляру tmux, если ваш сеанс ssh прерывается.
exec
Экономит вилку конечно.источник