現在、端末/接続(およびtmuxセッションの下)が転送されたかどうかを検出する方法を見つけようとしています。モシュまたは。
~からこのスレッド、現在参加している疑似ターミナルセッションを見つけました。
$ tty
/dev/pts/69
したがって、この疑似端末を生成したプロセス、またはこのttyを子プロセスとして所有するプロセスに関する情報が必要です。この情報を使用すると、それがソースかsshd
ソースかを判断できますmosh
。しかし、どうすればいいですか?
もう一つの挑戦:現在のシェルtmuxから、検索されたttyは、tmuxが他の疑似端末も割り当てるため、sshd / mosh-server情報と一致しない可能性があります。 tmuxセッションがどのように作成されるかに関係なく、現在の接続がSSHかmoshかを区別する必要があります。それはどのように可能ですか?
いくつかの実験:
(1) SSH の場合、sshd
tty と一致するプロセスを見つけることができます。
$ ps x | grep sshd | grep 'pts\/27'
5270 ? S 0:00 sshd: wookayin@pts/27
これにより、現在の接続がSSH経由であることがわかります。しかし、moshを介して関連情報を見つけることができません。
SSH_CLIENT
SSH_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()