Mencegah klien SSH meneruskan variabel lingkungan TERM ke server?


20

Saya saat ini menggunakan terminal Fedora 18 gnome , kemudian mulai tmuxmultiplexer di dalamnya. Setelah saya terhubung ke server CentOS 5 melalui sshperintah, saya menemukan:

  • ls hasil tidak memiliki warna
  • tmux, screen, hexedit, htopSemua gagal untuk memulai dengan pesan error seperti:
    terminal terbuka gagal: terminal hilang atau tidak cocok: layar-256color

Tampaknya sshmelewati variabel lingkungan $ TERM ke server, tetapi saya tidak dapat menemukannya di /etc/ssh/ssh_configfile Fedora 18.

Meskipun saya dapat secara manual mengubah variabel $ TERM di server, setiap kali saya terhubung, itu terjadi lagi. Lantas bagaimana cara mencegahnya?

Jawaban:


17

$TERM adalah memberi tahu aplikasi terminal apa yang mereka ajak bicara sehingga mereka tahu bagaimana berbicara dengannya.

Ubah ke nilai yang didukung oleh host jarak jauh dan yang cocok dengan terminal Anda sedekat mungkin ( screen).

Sebagian besar sistem Linux setidaknya harus memiliki screenentri terminfo. Jika tidak, screenlaksanakan superset vt100dan vt100bersifat universal. Begitu:

TERM=screen ssh host

atau

TERM=vt100 ssh host

Jika Anda memang membutuhkan dukungan 256 warna, Anda bisa mencoba xterm-256coloryang seharusnya cukup dekat ( screenmendukung 256 warna dengan cara yang sama xterm) dan memberi tahu aplikasi aplikasi terminal Anda mendukung 256 warna dan memberi tahu mereka cara menggunakannya.

Atau Anda dapat menginstal entri terminfo pada host jarak jauh.

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

2
baik untuk mengetahui infocmpdan tic, setelah dikompilasi, tidak perlu untuk sementara berubah $TERMlagi omong-omong, saya baru saja menyalin (rsync) /usr/share/terminfo/s/screen-256colordari Fedora 18 ke CentOS, sepertinya berfungsi ok ( rsync -tv /usr/share/terminfo/s/screen-256color root@the_host:/usr/share/terminfo/s).
LiuYan 刘 研

lupa disebutkan, saya berlari tmuxdi terminal gnome-Fedora 18, tmuxmengubah $TERMnilai screen-256colordari xterm-256color.
LiuYan 刘 研

btw, bisakah ssh bekerja dengan cara ini: dapatkan terminfo yang didukung oleh host / server (tidak didorong ke), lalu mengambil salah satu terminal klien dapat mendukung?
LiuYan 刘 研

2
infocmp | ssh -t root@remote-host 'cat > "$TERM.info" && tic "$TERM.info"'dapat disingkat menjadi infocmp | ssh root@remote-host "tic -". Ini berfungsi karena ketika Anda memiliki pipa itu dapat diakses sebagai file dengan menggunakan - dan untungnya pipa bekerja di SSH.
Alan Jenkins

1
@ starfry, saya tidak bisa memberi Anda jaminan bahwa format biner dari file tic(terminfo compiler) yang dihasilkan akan sama dari satu sistem ke sistem berikutnya atau lokasinya sama. ticmungkin juga memastikan izinnya benar atau membuat direktori perantara di mana diperlukan.
Stéphane Chazelas

10

Dalam kasus saya, saya hanya menambahkan alias ke .zshrc( .bashrcjika menggunakan bash) di desktop lokal saya:

alias ssh='TERM=xterm ssh'

Jika Anda sudah menggunakan alias, sesuaikan untuk memasukkan tugas Lingkungan.


1

Saya menempatkan ini di .bashrchost jarak jauh saya:

# 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

Dengan begitu, keduanya xterm-256colordan screen-265colorditangani dengan benar. Juga, saya sudah mengeluarkan catatan sehingga jika server kemudian ditingkatkan dan mendukung 256 warna, saya tidak akan membenturkan kepala saya ke dinding bertanya-tanya mengapa variabel TERM saya akan berubah ketika SSHing.


Atau, jangan memulai subkulit dan proses lain:export TERM=${TERM%%-256color}
miken32

1

Mengubah $TERMmungkin berhasil, tetapi saya tidak menyarankan ini, itu hanya solusi dan bukan solusi.

Ketika saya menemukan masalah ini pada sistem saya, saya memperbaikinya dengan menginstal dukungan untuk jenis terminal paling umum ke sistem jarak jauh:

  • yum install ncurses-baseuntuk screen-256colordi CentOS
  • yum install ncurses-termuntuk screen-256color-bcedi CentOS
  • apt install ncurses-baseuntuk keduanya screen-256colordan screen-256color-bcedi Debian, Ubuntu dan Mint

Paket-paket yang berhubungan dengan ncurses juga menyediakan dukungan untuk banyak terminal lain, dan mereka juga tersedia di semua distribusi besar lainnya. (Tapi untuk kasus penggunaan saya dan pertanyaan Anda ini harus cukup info)


0

Lihat 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.

dan 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.

Menurut itu, defaultnya adalah tidak mengirim variabel apa pun, tetapi TERM tampaknya istimewa. Tetap dikirim.

Oleh karena itu Anda dapat mengubah JANGKA WAKTU saat memanggil ssh (seperti TERM=xterm ssh ...), mengubahnya setelah masuk (seperti di .bash_profile), atau menentukan jenis JANGKA yang tidak dikenal di sisi server (dengan asumsi Anda memiliki akses root di sana). Lihat jawaban lain untuk detailnya.


1
Pengaturan $TERMtidak akan benar-benar lebih baik daripada mengaturnya ke nilai yang tidak didukung.
Stéphane Chazelas

Pertanyaan literalnya adalah, bagaimana cara mencegah pengiriman JANGKA. - Jawab: Anda tidak bisa. - Apa yang harus dia lakukan adalah mengaturnya ke nilai yang sesuai, ya.
michas

mengubah $TERMsementara mungkin merupakan solusi, tetapi saya harus melakukannya setiap waktu. by the way, tampaknya bahwa kedua CentOS 5 dan Fedora 18 Terima Env semua variabel lingkungan lokal ( LANG, LC_*, ...)
Liuyan刘研
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.