현재 터미널이 mosh를 통과하는지 확인하세요.

현재 터미널이 mosh를 통과하는지 확인하세요.

현재 터미널/연결(및 tmux 세션 아래)이 전달되었는지 감지하는 방법을 찾으려고 노력 중입니다.모쉬아니면.

~에서이 스레드, 현재 참여 중인 의사 터미널 세션을 찾았습니다.

$ tty
/dev/pts/69

따라서 이 의사 터미널을 생성한 프로세스 또는 이 tty를 하위 프로세스로 소유하는 프로세스에 대한 정보가 필요합니다. 이 정보를 사용하면 그것이 출처인지 sshd또는 출처인지 판단할 수 있을 것입니다 mosh. 하지만 어떻게 할 수 있나요?

또 다른 도전: 현재 쉘이tmux에서, 검색된 tty는 tmux가 다른 의사 터미널도 할당하기 때문에 sshd/mosh-server 정보와 일치하지 않을 수 있습니다. tmux 세션이 어떻게 생성되는지에 관계없이 현재 연결이 SSH인지 mosh인지 구별해야 합니다. 그게 어떻게 가능하지?

몇 가지 실험:

(1) SSH의 경우 sshdtty와 일치하는 프로세스를 찾을 수 있습니다.

$ ps x | grep sshd | grep 'pts\/27'
 5270 ?        S      0:00 sshd: wookayin@pts/27

이렇게 하면 현재 연결이 SSH를 통한 것임을 알 수 있습니다. 그러나 mosh를 통해 관련 정보를 찾을 수 없습니다.

SSH_CLIENTSSH_TTY(2) ssh/mosh가 tmux 세션 내에서도 이러한 변수를 잘못 설정하므로 또는 같은 환경 변수를 사용하면 작동하지 않을 수 있습니다.

답변1

나는 이에 대한 좋은 해결책을 생각해냈고 이를 간단한 스크립트로 포장했습니다.is_mosh:

#!/bin/bash

has_ancestor_mosh() {
    pstree -ps $1 | grep mosh-server
}

is_mosh() {
    # argument handling
    for arg in "$@"; do
        case $arg in
          -v|--verbose) local VERBOSE=YES ;;
          *) ;;
        esac
    done

    if [[ -n "$TMUX" ]]; then
        # current shell is under tmux
        local tmux_current_session=$(tmux display-message -p '#S')
        local tmux_client_id=$(tmux list-clients -t "${tmux_current_session}" -F '#{client_pid}')
        # echo $tmux_current_session $tmux_client_id
        local pid="$tmux_client_id"
    else
        local pid="$$"
    fi

    local mosh_found=$(has_ancestor_mosh $pid)   # or empty if not found
    if [[ -z "$mosh_found" ]]; then
        return 1;    # exit code 1: not mosh
    fi

    test -n "$VERBOSE" && echo "mosh"
    return 0;        # exit code 0: is mosh
}


sourced=0
if [ -n "$ZSH_EVAL_CONTEXT" ]; then
  case $ZSH_EVAL_CONTEXT in *:file) sourced=1;; esac
elif [ -n "$BASH_VERSION" ]; then
  [ "$0" != "$BASH_SOURCE" ] && sourced=1
else
  case ${0##*/} in sh|dash) sourced=1;; esac
fi
if [[ $sourced == 0 ]]; then
  is_mosh $@
fi

아이디어는 매우 간단합니다. (i) 현재 tmux 세션에 연결된 tmux 클라이언트를 찾은 다음 (ii) 해당 상위 프로세스를 검색하여 mosh 프로세스가 있는지 확인합니다.

환경에 따라 완벽하지 않을 수도 있지만 24비트 색상 기능을 성공적으로 감지하고 적용할 수 있습니다.~하지 않는 한mosh에서는 실행되지 않습니다(mosh는 24비트 색상을 지원하지 않기 때문). 이것은떨어져 있는(다음 줄을 귀하의 줄에 추가하세요 ~/.vimrc):

" 24-bit true color: neovim 0.1.5+ / vim 7.4.1799+
" enable ONLY if TERM is set valid and it is NOT under mosh
function! s:is_mosh()
  let output = system("is_mosh -v")
  if v:shell_error
    return 0
  endif
  return !empty(l:output)
endfunction

function s:auto_termguicolors()
  if !(has("termguicolors"))
    return
  endif

  if (&term == 'xterm-256color' || &term == 'nvim') && !s:is_mosh()
    set termguicolors
  else
    set notermguicolors
  endif
endfunction
call s:auto_termguicolors()

관련 정보