현재 터미널/연결(및 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()