SSH 클라이언트가 TERM 환경 변수를 서버로 전달하지 못하게 하시겠습니까?


20

저는 현재 Fedora 18을 사용하고 있습니다 gnome-terminal을tmux 멀티플렉서 를 시작 했습니다. 명령을 통해 CentOS 5 서버에 연결 한 후 ssh다음을 찾습니다.

  • ls 결과에 색상이 없습니다
  • tmux, screen, hexedit, htop모든 오류 메시지 등을 시작하지 못했습니다 :
    터미널 열기 실패 : 터미널이 없거나 적합하지 않음 : screen-256color

ssh$ TERM 환경 변수를 서버에 전달하는 것으로 보이지만 /etc/ssh/ssh_configFedora 18 파일 에서 찾을 수 없습니다 .

서버에서 $ TERM 변수를 수동으로 변경할 수 있지만 연결할 때마다 다시 발생합니다. 그래서 그것을 방지하는 방법?

답변:


17

$TERM 응용 프로그램에게 어떤 터미널을 말하고 있는지 알려주는 방법입니다.

원격 호스트가 지원하고 터미널 ( screen) 과 최대한 일치하는 값으로 변경하십시오 .

대부분의 Linux 시스템에는 최소한 screenterminfo 항목 이 있어야합니다 . 그렇지 않은 경우 screen의 상위 집합을 구현 vt100하고 vt100보편적이다. 그래서:

TERM=screen ssh host

또는

TERM=vt100 ssh host

256 색상 지원이 필요한 경우 xterm-256color어느 쪽이 가까이 있어야하는지 ( screen같은 방법으로 256 색상 지원 xterm) 터미널 응용 프로그램에 256 색상을 지원하고 사용 방법을 알려주십시오.

또는 원격 호스트에 terminfo 항목을 설치할 수 있습니다.

infocmp -x | ssh -t root@remote-host '
  cat > "$TERM.info" && tic -x "$TERM.info"'

2
좋은 알고 infocmptic컴파일하면, 필요 일시적으로 변경할을 $TERM다시. /usr/share/terminfo/s/screen-256color그건 그렇고, 방금 Fedora 18에서 CentOS로 (rsync) 를 복사 했는데 정상적으로 작동하는 것 같습니다 ( rsync -tv /usr/share/terminfo/s/screen-256color root@the_host:/usr/share/terminfo/s).
LiuYan 刘 研

언급 깜빡 나는 달렸다 tmux그놈 터미널 페도 18에서 tmux변경된 $TERM가치를 screen-256colorxterm-256color.
LiuYan 刘 研

btw, ssh는 이런 식으로 작동 할 수 있습니다 : 어떤 호스트 / 서버가 지원되는지 (밀어 넣지 않은) terminfo를 얻은 다음 클라이언트 터미널이 지원할 수있는 것을 가져 오십시오.
LiuYan 刘 研

2
infocmp | ssh -t root@remote-host 'cat > "$TERM.info" && tic "$TERM.info"'로 단축 할 수 있습니다 infocmp | ssh root@remote-host "tic -". 파이프가 있으면 파이프를 사용하여 파일로 액세스 할 수 있기 때문에 작동합니다. 다행히도 파이프는 SSH에서 작동합니다.
앨런 젠킨스

1
@ starfry, tic(terminfo 컴파일러) 생성 파일 의 이진 형식이 한 시스템에서 다음 시스템으로 동일하거나 위치가 동일 하다는 것을 보장 할 수는 없습니다 . tic권한이 올바른지 확인하거나 필요한 경우 중간 디렉토리를 작성할 수도 있습니다.
Stéphane Chazelas

10

내 경우에는 내가 단순히 별칭을 추가 내 .zshrc( .bashrc내 로컬 데스크톱에서 떠들썩한 파티를 사용하는 경우) :

alias ssh='TERM=xterm ssh'

이미 별명을 사용하는 경우 환경 지정을 포함하도록 별명을 조정하십시오.


1

나는 이것을 .bashrc원격 호스트에 넣었다 .

# 256-color mode not supported on this host
if echo $TERM | grep -q -- '-256color'; then
    echo -e '\n\n256-color mode not supported on this host.  Reverting TERM...\n'
    export TERM=`echo -n $TERM | sed 's/-256color//'`
fi

그런 식으로, 모두 xterm-256colorscreen-265color적절하게 처리됩니다. 또한 서버가 나중에 업그레이드되고 256 색상을 지원하는 경우 SSH를 할 때 TERM 변수가 왜 변경되는지 궁금해 벽에 머리를 부딪치지 않을 것입니다.


또는 서브 쉘과 다른 프로세스를 시작하지 마십시오.export TERM=${TERM%%-256color}
miken32

1

바꾸다 $TERM 은 효과가 있지만 제안하지는 않지만 솔루션 대신 해결 방법 일뿐입니다.

시스템에서이 문제가 발생하면 가장 일반적인 터미널 유형에 대한 지원을 원격 시스템에 설치하여이 문제를 해결합니다.

  • yum install ncurses-base대한 screen-256colorCentOS는에
  • yum install ncurses-term대한 screen-256color-bceCentOS는에
  • apt install ncurses-base모두 screen-256colorscreen-256color-bce데비안, 우분투, 민트에

ncurses 관련 패키지는 또한 많은 다른 터미널을 지원하며 다른 모든 대규모 배포판에서도 사용할 수 있습니다. (그러나 내 유스 케이스와 귀하의 질문에 충분한 정보가 있어야합니다)


0

man ssh_config를 참조하십시오.

 SendEnv
         Specifies what variables from the local environ(7) should be sent
         to the server.  Note that environment passing is only supported
         for protocol 2.  The server must also support it, and the server
         must be configured to accept these environment variables.  Refer
         to AcceptEnv in sshd_config(5) for how to configure the server.
         Variables are specified by name, which may contain wildcard char‐
         acters.  Multiple environment variables may be separated by
         whitespace or spread across multiple SendEnv directives. The
         default is not to send any environment variables.

man sshd_config :

 AcceptEnv
         Specifies what environment variables sent by the client will be
         copied into the session's environ(7).  See SendEnv in
         ssh_config(5) for how to configure the client.  Note that envi-
         ronment passing is only supported for protocol 2.  Variables are
         specified by name, which may contain the wildcard characters `*'
         and `?'.  Multiple environment variables may be separated by
         whitespace or spread across multiple AcceptEnv directives.  Be
         warned that some environment variables could be used to bypass
         restricted user environments.  For this reason, care should be
         taken in the use of this directive.  The default is not to accept
         any environment variables.

이에 따르면 기본값은 변수를 보내지 않아야하지만 TERM은 특별한 것으로 보입니다. 어쨌든 보내드립니다.

따라서 ssh를 호출 할 때 TERM을 변경하거나 (와 같이 TERM=xterm ssh ...) 로그인 후이를 변경 .bash_profile하거나 (와 같이 ) 서버 측에서 알 수없는 TERM 유형을 정의 할 수 있습니다 (루트 액세스 권한이 있다고 가정). 자세한 내용은 다른 답변을 참조하십시오.


1
설정 $TERM하지 않으면 실제로 지원되지 않는 값으로 설정하는 것보다 낫지는 않습니다.
Stéphane Chazelas

문자적인 질문은 TERM 전송을 방지하는 방법이었습니다. -답변 : 할 수 없습니다. -그가해야 할 일은 그것을 적절한 가치로 설정하는 것입니다.
michas

$TERM일시적으로 변경 하는 것이 해결 방법 일 수 있지만 매번 변경 해야합니다. 그런데, 모두에 CentOS 5 페도라 18 동의 것으로 보인다 봉투를 모든 로케일 환경 변수를 ( LANG, LC_*, ...)
LiuYan刘研
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.