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"