1

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"检查。这是因为对于moshshell 的进程名称是bash和外壳的父进程名称是mosh-server和不是sshd。进一步调查显示,mosh执行.bashrc两次一次 assshd和一次 as mosh-server。这可以通过放入 .My 来ps -o comm= -p $PID -p $$ >> moshbash重现.bashrctmux attach永远挂起sshdmosh

我发现一个简单的解决方法是

mosh user@server -- tmux attach -t `whoami`

我也可以对我的 ssh 做类似的事情,从客户端触发命令并完全消除 .bashrc 脚本,但我不希望将服务器端自动化溢出到客户端。

其实mosh好像也没有错。每个 PID 只获取一次.bashrc文件。我认为.bashrc启动阻塞会话是一个糟糕的设计,tmux因为tmux也需要终端,我们也不能作为后台进程启动,所以&也不会工作。有没有其他方法可以解决这个问题?我认为,如果我们可以区分设置 sshd 的 mosh 客户端和设置 sshd 的 ssh 客户端,则可以使用该信息。

4

1 回答 1

2

.bashrc每次交互式非登录 bash 实例化时总是执行,因此请改用.bash_profile它,这样它只会在登录到 ssh 期间运行一次。如果脚本或脚本的进程调用bash,会导致重复调用。

有关更多信息和其他启动文件,请参阅Bash 启动文件。

于 2014-07-24T05:43:28.983 回答