Tmux автозапуск при подключении по ssh

У меня часто бывает, что я подключусь к серверу по ssh и запускаю какую либо задачу (копирование, проверки) которая может затянуться. Потом внезапно либо ssh отвалится ибо подключился с ноутбука или, что чаще всего случается - перевожу комп в спячку напрочь забыв про то, что там где-то что-то на сервере выполняется. Выполняемая на сервере задача при этом само собой прерывается. Все это от того, что я забываю запустить tmux при подключении. Чтобы этого не происходило, я настроил автозапуск tmux при подключении по SSH.

Если вы не в курсе что такое tmux, то я когда-то давно довольно кратко его описывал.

"Настроил" сильно сказано. По факту, в зависимости от того, какой shell используете нужно добавить небольшой кусочек кода в .bashrc или .zshrc.

Bash

Если у вас bash, то добавляем следующее в ~/.bashrc:

if [[ -z $TMUX && -n $SSH_TTY ]]; then
    me=$(whoami)
    real_tmux=$(command -v tmux)

    if [ -z $real_tmux ]; then
        echo "No tmux installed."
    fi

    export TERM="xterm-256color"

    if $real_tmux has-session -t $me 2>/dev/null; then
        $real_tmux attach-session -t $me
    else
        if [[ -n $SSH_TTY ]]; then
            (tmux new-session -d -s $me && tmux attach-session -t $me)
        fi
    fi
fi

Zsh

В случае, если у вас zsh, то в ~/.zshrc:

if [[ -z $TMUX && -n $SSH_TTY ]]; then
    me=$(whoami)
    real_tmux=$(whence -p tmux)

    if [ -z $real_tmux ]; then
        echo "No tmux installed."
    fi

    export TERM="xterm-256color"

    if $real_tmux has-session -t $me 2>/dev/null; then
        $real_tmux attach-session -t $me
    else
        if [[ -n $SSH_TTY ]]; then
            (tmux new-session -d -s $me && tmux attach-session -t $me)
        fi
    fi
fi

Разница между версией для bash и zsh в одной строке. В bash which возвращает путь до исполняемого файла, вне зависимости от наличия alias на него. В zsh же, which - это встроенная команда, которая в случае наличия alias на команду вернет его. Вот наглядно:

# ZSH
╰─➤  type which
which is a shell builtin
╰─➤  which tmux
tmux: aliased to tmux_run
╰─➤  whence tmux
tmux_run
bosha:~$ which tmux
/usr/bin/tmux
# bash
bosha:~$ which tmux
/usr/bin/tmux

Alias на tmux сделан для того, чтобы в случае если я не забуду запустить tmux после подключения к серверу, сессия создалась с правильным названием, и при повторном подключении к серверу "приатачились" к правильной tmux сессии.

Делаем alias для Tmux

Если запустите tmux самостоятельно, то надо чтобы сессия создалась с правильным названием.

Для bash:

tmux_run() {
    me=$(whoami)
    real_tmux=$(which tmux)
    args_num="$#"

    export TERM="xterm-256color"

    if [ "$#" -gt 0 ]; then
        $real_tmux "$*"
    else
        if [[ ! -z $TMUX ]]; then
            $real_tmux
        else
            if $real_tmux has-session -t $me 2>/dev/null; then
                $real_tmux attach-session -t $me
            else
                $real_tmux new -s $USER
                $real_tmux attach-session -t $me
            fi
        fi
    fi
}
alias tmux="tmux_run"

Для zsh:

tmux_run() {
    me=$(whoami)
    real_tmux=$(whence -p tmux)
    args_num="$#"

    export TERM="xterm-256color"

    if [ "$#" -gt 0 ]; then
        $real_tmux "$*"
    else
        if [[ ! -z $TMUX ]]; then
            $real_tmux
        else
            if $real_tmux has-session -t $me 2>/dev/null; then
                $real_tmux attach-session -t $me
            else
                $real_tmux new -s $USER
                $real_tmux attach-session -t $me
            fi
        fi
    fi
}
alias tmux="tmux_run"


Понравилась статья? Поделись с друзьями!




Комментарии на этом сайте требуют включенного Javascript в вашем браузере. Вероятно, ваш браузер не поддерживает Javascript, или он был отключен по каким-то причинам. Если вы хотите прокомментировать пост, или просто почитать комментарии, то пожалуйста, включите Javascript или попробуйте открыть эту страницу другим браузером.