web-dev-qa-db-ja.com

現在の端末がモッシュを通過しているかどうかを検出します

現在の端末/接続(およびtmuxセッション中)がmoshを経由しているかどうかを検出する方法を見つけようとしています。

このスレッド から、現在実行している疑似端末セッションを見つけました。

$ tty
/dev/pts/69

したがって、この疑似端末を生成したプロセス、またはこのttyを子として所有しているプロセスに関する情報が必要です。この情報があれば、それがsshdからのものかmoshからのものかを判断できるかもしれません。しかし、どうすればそれを行うことができますか?

別の課題:現在のシェルがtmuxの下の場合、tmuxは別の疑似サーバーも割り当てるため、取得したttyはsshd/mosh-server情報と一致しない可能性があります-ターミナル。 tmuxセッションがどのように作成されたかに関係なく、現在の接続がSSHまたはmoshと区別する必要があります。どうすれば可能ですか?

いくつかの試験:

(1)SSHの場合、ttyに一致するsshdプロセスを見つけることができました。

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

したがって、現在の接続がSSH経由であることがわかります。しかし、モッシュを通して、私は関連する情報を見つけることができませんでした。

(2)SSH_CLIENTSSH_TTYのような環境変数の使用は、ssh/moshの両方がこれらの変数を設定するために機能しない可能性があり、tmuxセッション内でも間違っています。

2
Jongwook Choi

私はこれに対するまともな解決策を考え出し、それを単純なスクリプトとしてラップしました: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()
2
Jongwook Choi