4

I switched from bash to fish shell. I liked it and decided to use it on my servers also. How can I start tmux automatically on ssh connection? I followed this instruction for bash but fish shell is different and this recipe doesn't work without cardinal rewriting.

rominf
  • 517

3 Answers3

5

I rewrote script. The most tricky part was to disconnect from ssh by exiting from fish as exit inside ./.config/fish/config.fish didn't work.

It starts tmux only if parent of the fish is ssh.

Here is part of my ./.config/fish/config.fish file:

if status --is-login
    set PPID (echo (ps --pid %self -o ppid --no-headers) | xargs)
    if ps --pid $PPID | grep ssh
        tmux has-session -t remote; and tmux attach-session -t remote; or tmux new-session -s remote; and kill %self
        echo "tmux failed to start; using plain fish shell"
    end
end

More readable version can be found in my other question (thanks to ridiculous-fish, author of fish shell): How to use booleans in fish shell?

rominf
  • 517
1

Byobu, a terminal multiplexer, based on tmux, offers an autostart feature.

Édouard Lopez
  • 1,332
  • 1
  • 12
  • 23
rominf
  • 517
0

Make a .fish file in .config/fish/conf.d:

if status --is-interactive
    echo server is interactive
    if set -q SSH_CONNECTION[1]; and set -q SSH_CLIENT[1]; and set -q SSH_TTY[1]; or pstree -p | grep "sshd.*\($fish_pid\)"; and not set -q TMUX
        tmux new -AD -t remote -s remote
    end
end

If your local machine also has a tmux session, then you have to use CTRL+B CTRL+B D to detach from remote session. More details here. To know why we are using -AD in the tmux command, please check here.

P.S. Just to be clear about the accepted answer, normally fish is not set as the login shell. So, after ssh, we run fish. In that case PPID is bash and not ssh.

Ahmad Ismail
  • 2,678