我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
和外壳的父进程名称是mosh-server
和不是sshd
。进一步调查显示,mosh
执行.bashrc
两次一次 assshd
和一次 as mosh-server
。这可以通过放入 .My 来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
也需要终端,我们也不能作为后台进程启动,所以&
也不会工作。有没有其他方法可以解决这个问题?我认为,如果我们可以区分设置 sshd 的 mosh 客户端和设置 sshd 的 ssh 客户端,则可以使用该信息。