Сделал себе автоподключение к сессии tmux (или автозапуск tmux-сервера с новой сессией, если её ещё нет) при заходе в локальную консоль или при подключении по ssh к удалённым машинам (пользоваться бесплатным шеллом bshellz стало удобней).
# Autostart tmux on login
__autostart_tmux() {
# $( type -p ) - built-in in sh or bash only?
#TMUX_BIN="$( whereis tmux | cut -d " " -f 2 )"
# which versions different output format
TMUX_BIN="$( which tmux 2> /dev/null )"
if [ -z "${TMUX_BIN}" ]; then
echo "Tmux not found"
return 0
fi
TMUX_AS_SESS_NAME="$(echo "${USER}" | cut -c '1-3')"
# return empty line if specified session exist or return 1
TMUX_AS_SESS_RUN="$( tmux has-session -t "${TMUX_AS_SESS_NAME}" &> /dev/null || echo "$?" )"
#TMUX_AS_DAEMON_MODE="$1" # $1 == "-d" or " "
#TMUX_AS_EXIT="$2" # "return 0" or "exit 0"
# do not attach automatically to tmux session if login on local XTerm
if [ -z "${TMUX_AS_SESS_RUN}" ] && [ -z "${SSH_TTY}" ] && [ "${TERM}" = "xterm" ]; then
echo "Tmux: running, not attached on local XTerm"
return 0
# do not run tmux automatically in another tmux (or screen)
# in exists tmux session shell be started on non-login mode and .profile not used
# (see set -g default-command "${SHELL}" in tmux.conf)
elif [ -n "${TMUX}" ] || [ "${TERM}" = "screen" -o "${TERM}" = "screen-256color" ]; then
echo 'Tmux: not be running in another terminal multiplexer "'${TERM}'"'
return 0
# attach to existed tmux session or create it and exit login-shell; or print error message
else
((tmux has-session -t "${TMUX_AS_SESS_NAME}" && exec tmux attach-session -t "${TMUX_AS_SESS_NAME}") || (tmux new-session -d -s "${TMUX_AS_SESS_NAME}" && exec tmux attach-session -t "${TMUX_AS_SESS_NAME}")) && exit 0;
echo "Tmux: autostart failed: $?"
fi
}
Теперь, при логине в локальную консоль, происходит автоматический запуск tmux-сервера (если нужно) и подключение к нему, при заходе через ssh на удалённую машину (на которую предварительно скопирован .profile) — аналогично, при старте X-сервера и openbox — запускается tmux в режиме демона, без подключения к сессии.
Правда, для запуска xterm напрямую из меню openbox пришлось сделать костыль — запускать его сразу с указанием оболочки: xterm -e bash
. В противном случае он то ли не выставляет переменную ${TERM}
, то ли выставляет её как-то отлично от "xterm"
— не удалось разобраться. И в результате происходит подключение к tmux тогда, когда мне этого не нужно. А если сделать xterm -e bash
и из запущенного терминала запустить новый: xterm &
, то в этом новом экземпляре терминала тоже произойдет подключение к сессии tmux. Хотелось бы знать, куда копать для исправления такой ситуации…
UPD: Проблема была не в ${TERM}
, а в пустой переменной ${TMUX}
при запуске нового экземпляра xterm. Решилось добавлением проверки дополнительного условия TMUX_AS_SESS_RUN=$( tmux has-session -t "${TMUX_AS_SESS_NAME}" )
при автозапуске tmux в x-terminal-emulator.
UPD2: В OpenSSH с некоторых пор была добавлена опция RemoteCommand — как ясно из названия, она служит для выполнения команды удалённо после установки соединения. Поэтому, в простом случае, автозапуск tmux с подключением сессии можно выполнять средствами самого ssh. Либо через ключи командной строки, либо добавив в ~/.ssh/config
следующие параметры (с указанием имени сессии tmux или без оного, как в пример ниже):
RequestTTY yes
RemoteCommand tmux attach || tmux
Или так, для создания именованой сессии:
RequestTTY yes
RemoteCommand tmux new-session -As dim
P.S.: Кстати, tmux отлично работает внутри tmux же. Для обращения к «вложенному» экземпляру надо использовать «двойной» командный префикс, по умолчанию это будет Ctrl+b+b
. Или назначить «вложенному» свой префикс, что, на мой взгляд, менее удобно.
в .tmux.conf запишите
new-session
и tmux attach должно хватить.