Apakah mungkin untuk mengubah nilai $ TERM saat menelepon ssh?

21

Di terminal lokal saya, saya memiliki TERM = konsole-256color, tetapi tidak semua mesin jarak jauh yang saya hubungkan memiliki definisi ini.

Apakah mungkin untuk membuat ssh mengubah TERM pada mesin jarak jauh? Tanpa mengubah skrip .bash * pada mesin jarak jauh, hanya dengan mengubah konfigurasi pada desktop lokal saya?


sumber

Jawaban:

9

Saya telah menambahkan alias berikut ke file .bashrc saya. Ini menggunakan jawaban OG tetapi membungkusnya dengan alias. Bekerja seperti pesona;)

# Force xterm-color on ssh sessions
alias ssh='TERM=xterm-color ssh'
Johan
sumber
Ini berfungsi jika saya menggunakan ssh dari terminal. Tetapi saya juga memiliki beberapa skrip yang menjalankan ssh, dan alias tidak diperluas untuk mereka. Apakah ada cara saya bisa menghindari membuat alias terpisah untuk masing-masing?
Thayne
Jika skrip Anda memerlukan nilai JANGKA tertentu, saya pikir akan lebih baik untuk hanya menetapkan varialble dalam skrip itu sendiri. Atau bukankah itu pilihan?
Johan
Itu bukan pilihan. Selain itu, skrip ini memilih server berdasarkan beberapa parameter dan membuka sesi ssh ke server itu (atau mungkin server dalam sesi tmux), skrip itu sendiri tidak bergantung pada nilai TERM.
Thayne
Dalam hal ini Anda dapat memasukkan profil bash Anda, atau skrip alias terpisah ke dalam skrip dengan: shopt -s expand_aliases; sumber ~ / .bash_aliases
Johan
7
TERM=vt100 ssh some.host.name

Pada jarak jauh, jalankan echo $ TERM .

OG
sumber
Saya berpikir tentang hal itu, tapi saya ingin itu hanya untuk subset dari host yang saya ssh, jadi mengeluarkan TERM = ... ssh sepanjang waktu tidak akan berfungsi. dan mengingat host mana yang memiliki info termcap lama, dan kemudian mengubah perintah dengan cepat juga tidak baik.
Konfigurasi per-host hanya didukung di / etc / ssh / ssh_config, namun saya tahu tidak ada nilai konfigurasi untuk mendukung pemetaan skema terminal per host.
OG
Itu juga dapat dilakukan di ~ / .ssh / config, yang saya tahu, tetapi saya juga tidak dapat menemukan opsi untuk mengubah lingkungan yang dikirim ke server jauh. Berharap aku melewatkan sesuatu.
7

man ssh:

     ssh reads ~/.ssh/environment, and adds lines of the format
     “VARNAME=value” to the environment if the file exists and users are
     allowed to change their environment.  For more information, see the
     PermitUserEnvironment option in sshd_config(5).

Edit:

Tikus, saya berharap itu bisa di sisi lokal, masih, jika ada kemauan, ada jalan. man ssh_conf:

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.

Tergantung pada konfigurasi sshd pada sisi penerima, ini mungkin memenuhi atau tidak memenuhi persyaratan "tidak ada modifikasi file jarak jauh".

Paweł Brodacki
sumber
1
Ya, tetapi ini adalah konfigurasi di sisi jarak jauh, dan saya perlu / menginginkan sesuatu yang hanya berubah pada ujung lokal.
4
SendEnv tidak terkait. Itu mungkin dapat mengirim variabel env tambahan, tetapi: 1. tidak dapat memodifikasinya, dan 2. TERM tetap dikirim, bahkan jika itu tidak terdaftar di SendEnv.
5

Inilah solusi cepat dan kotor yang baru saja saya lempar bersama. Saya lebih suka sesuatu yang lebih baik. Saya kira saya bisa menggunakan skrip shell sebagai gantinya. Menyesuaikan TERMnilai dibiarkan sebagai latihan untuk pembaca.

# To move into a separate plugin...
function ssh {
   if [[ "${TERM}" = screen* || konsole* ]]; then
     env TERM=screen ssh "$@"
   else
     ssh "$@"
   fi
}

Idealnya, itu akan melakukan sesuatu seperti memeriksa JANGKA di sisi lain, menggunakan ControlPersistbarang - barang untuk mencegah penundaan lama untuk beberapa koneksi.

docwhat
sumber
Terima kasih! Saya melakukan sesuatu seperti ini, tetapi alih-alih memeriksa nilai spesifik $TERMdengan if/ elsekonstruksi, saya menggunakan $(echo -n "$TERM" | sed -e s/tmux/screen/)untuk tanpa syarat mengganti "tmux" yang bermasalah dalam istilah lokal saya dengan tipe "layar" yang lebih diterima secara universal ( sumber di sini ).
wincent