我在构建服务器中使用tmux
。最近我编写了一个小的.bashrc
脚本,如果退出,它将自动附加到tmux
会话。该脚本如下所示
# Automate tmux Startup
if [ -z "$TMUX" ]; then
# we're not in a tmux session
if [ `ps -o comm= -p $PPID` == "sshd" ]; then
# even VNC can have $SSH_TTY and $SSH_CONNECTION set so we cant find out
# if we want to attach to tmux during ssh so we need to see if parent
# process is sshd see
# http://unix.stackexchange.com/questions/145780/linux-ssh-connection-is-set-even- without-sshing-to-the-server
# Only attach to tmux if its me
WHOAMI=$(whoami)
if tmux has-session -t $WHOAMI 2>/dev/null; then
tmux -2 attach-session -t $WHOAMI
else
echo "Start tmux with username as session name 'tmux new -s $WHOAMI' "
fi
fi #parent process check
else
echo "Inside tmux"
fi
问题是每当我ssh
使用mosh
它只是挂在tmux窗口内。我发现如果我删除这个脚本然后使用mosh ssh并手动附加到tmux那么我就不会遇到这个问题了。如果我将上述脚本放在.bashrc
中,则只会出现此问题。
我怀疑mosh正在等待.bashrc
完成并无限期地等待它,同时它也没有将鼠标和按键控制传递给tmux
。我通过从另一个终端终止tmux
会话来确认这一点,并发现mosh
已恢复并尝试执行我之前缓冲的击键。
奇怪的是mosh
如何设法跨越ps -o comm= -p $PPID == "sshd"
支票。这是因为对于mosh
,shell的进程名称为bash
,而shell的父进程名称为mosh-server
而不是sshd
。进一步调查显示,mosh
执行.bashrc
两次sshd
,一次mosh-server
。这可以通过将ps -o comm= -p $PID -p $$ >> moshbash
放入.bashrc
来重现。我的tmux attach
发生在sshd
并且永远挂起mosh
。
我发现的一个简单的解决方法是
mosh user @ server - tmux attach -t`whoami`
我也可以对我的ssh做类似的事情,从客户端发出命令并完全取消.bashrc脚本,但我不希望将服务器端自动化溢出到客户端。
实际上mosh
似乎并没有错。它每个PID只发送一个.bashrc
文件。我认为.bashrc
阻塞会话tmux
踢tmux
是一个糟糕的设计,因为&
也需要终端我们不能开始作为后台进程,因此{{1}}也不会工作。
有没有其他办法解决这个问题?我想如果我们可以在设置sshd的mosh客户端和设置sshd的ssh客户端之间进行distingushh,那么可以使用信息。
答案 0 :(得分:2)
.bashrc
总是在每次交互式非登录bash实例化时执行,因此请使用.bash_profile
,以便在登录ssh时只运行一次。如果脚本的脚本或进程传唤bash,则会导致重复召唤。
有关详细信息和其他启动文件,请参阅Bash Startup Files。