Ngăn chặn máy khách SSH chuyển biến môi trường TERM đến máy chủ?


20

Tôi hiện đang sử dụng Fedora 18 gnome-terminal , sau đó bắt đầu tmuxghép kênh trong đó. Sau khi tôi kết nối với máy chủ CentOS 5 thông qua sshlệnh, tôi tìm thấy:

  • ls kết quả không có màu
  • tmux, screen, hexedit, htopTất cả thất bại trong việc bắt đầu với thông báo lỗi như:
    thiết bị đầu cuối mở không thành công: thiết bị đầu cuối bị thiếu hoặc không phù hợp: screen-256color

Có vẻ như sshvượt qua biến môi trường $ TERM cho máy chủ, nhưng tôi không thể tìm thấy nó trong /etc/ssh/ssh_configtệp của Fedora 18.

Mặc dù tôi có thể tự thay đổi biến $ TERM trên máy chủ, nhưng mỗi lần tôi kết nối, nó lại xảy ra. Vậy làm thế nào để phòng ngừa?

Câu trả lời:


17

$TERM là nói cho các ứng dụng biết họ đang nói chuyện với thiết bị đầu cuối nào để họ biết cách nói chuyện với nó.

Thay đổi nó thành một giá trị được hỗ trợ bởi máy chủ từ xa và phù hợp nhất có thể với thiết bị đầu cuối của bạn ( screen).

Hầu hết các hệ thống Linux ít nhất phải có một screenmục terminfo. Nếu không, screenthực hiện một superset của vt100vt100là phổ quát. Vì thế:

TERM=screen ssh host

hoặc là

TERM=vt100 ssh host

Nếu bạn cần hỗ trợ 256 màu, bạn có thể thử xterm-256colorđủ gần ( screenhỗ trợ 256 màu giống như vậy xterm) và nói với các ứng dụng ứng dụng đầu cuối của bạn hỗ trợ 256 màu và cho họ biết cách sử dụng chúng.

Hoặc bạn có thể cài đặt mục terminfo trên máy chủ từ xa.

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

2
tốt để biết infocmptic, một khi được biên dịch, không cần phải thay đổi tạm thời $TERMmột lần nữa. Nhân tiện, tôi vừa sao chép (rsync) /usr/share/terminfo/s/screen-256colortừ Fedora 18 sang CentOS, có vẻ như nó hoạt động tốt ( rsync -tv /usr/share/terminfo/s/screen-256color root@the_host:/usr/share/terminfo/s).
LiuYan 刘

quên đề cập, tôi đã chạy tmuxtrong gnome-terminal của Fedora 18, tmuxthay đổi $TERMgiá trị screen-256colortừ xterm-256color.
LiuYan 刘

btw, ssh có thể hoạt động theo cách này không: lấy terminfo mà máy chủ / máy chủ hỗ trợ (không được đẩy vào), sau đó chọn một thiết bị đầu cuối khách hàng có thể hỗ trợ?
LiuYan 刘

2
infocmp | ssh -t root@remote-host 'cat > "$TERM.info" && tic "$TERM.info"'có thể rút ngắn thành infocmp | ssh root@remote-host "tic -". Điều này hoạt động bởi vì khi bạn có một đường ống, nó có thể được truy cập dưới dạng tệp bằng cách sử dụng - và may mắn là các đường ống hoạt động trên SSH.
Alan Jenkins

1
@starfry, tôi không thể đảm bảo với bạn rằng định dạng nhị phân của tệp tic(trình biên dịch terminfo) sẽ giống nhau từ hệ thống này sang hệ thống tiếp theo hoặc vị trí của chúng sẽ giống nhau. ticcũng có thể đảm bảo các quyền là chính xác hoặc tạo các thư mục trung gian khi cần thiết.
Stéphane Chazelas

10

Trong trường hợp của tôi, tôi chỉ cần thêm một bí danh vào .zshrc( .bashrcnếu sử dụng bash) trên màn hình cục bộ của mình:

alias ssh='TERM=xterm ssh'

Nếu bạn đã sử dụng bí danh, hãy điều chỉnh nó để bao gồm bài tập Môi trường.


1

Tôi đặt cái này trong .bashrcmáy chủ từ xa:

# 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

Bằng cách đó, cả hai xterm-256colorscreen-265colorđược xử lý đúng. Ngoài ra, tôi có ghi chú đầu ra để nếu máy chủ được nâng cấp sau và hỗ trợ 256 màu, tôi sẽ không đập đầu vào tường tự hỏi tại sao biến TERM của tôi bị thay đổi khi SSH.


Hoặc, đừng bắt đầu một subshell và một quy trình khác:export TERM=${TERM%%-256color}
miken32

1

Thay đổi $TERM có thể có tác dụng, nhưng tôi không đề xuất điều này, đó chỉ là cách giải quyết thay vì giải pháp.

Khi tôi gặp sự cố này trên các hệ thống của mình, tôi khắc phục bằng cách cài đặt hỗ trợ cho các loại thiết bị đầu cuối phổ biến nhất cho hệ thống từ xa:

  • yum install ncurses-basecho screen-256colortrên CentOS
  • yum install ncurses-termcho screen-256color-bcetrên CentOS
  • apt install ncurses-basecho cả screen-256colorscreen-256color-bcetrên Debian, Ubuntu và Mint

Các gói liên quan đến ncurses cũng cung cấp hỗ trợ cho rất nhiều thiết bị đầu cuối khác và chúng cũng có sẵn trên tất cả các bản phân phối lớn khác. (Nhưng đối với trường hợp sử dụng của tôi và câu hỏi của bạn thì điều này cần có đủ thông tin)


0

Xem người đàn ông 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.

và người đàn ông 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.

Theo đó, mặc định không được gửi bất kỳ biến nào, nhưng TERM dường như là đặc biệt. Nó vẫn được gửi.

Do đó, bạn có thể thay đổi TERM khi gọi ssh (như TERM=xterm ssh ...), thay đổi sau khi đăng nhập (như trong .bash_profile) hoặc xác định loại TERM không xác định ở phía máy chủ (giả sử bạn có quyền truy cập root ở đó). Xem câu trả lời khác để biết chi tiết.


1
Không thiết lập $TERMsẽ không thực sự tốt hơn là đặt nó thành một giá trị không được hỗ trợ.
Stéphane Chazelas

Câu hỏi theo nghĩa đen là, làm thế nào để ngăn chặn việc gửi HẠN. - Trả lời: Bạn không thể. - Những gì anh ấy nên làm là đặt nó thành một giá trị phù hợp, vâng.
michas

thay đổi $TERMtạm thời có thể là một cách giải quyết, nhưng tôi cần phải làm điều đó mỗi lần. bằng cách này, có vẻ như cả hai CentOS 5 và Fedora 18 Chấp nhận Env tất cả các biến môi trường locale ( LANG, LC_*, ...)
LiuYan刘研
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.