Perbaiki judul terminal setelah SSH melakukan logging jarak jauh ke komputer lain

18

saat ini saya menggunakan kode perl satu baris untuk mengubah judul bar terminal saya,

print("\e]0;@ARGV\7");

tetapi setiap kali setelah saya ssh ke mesin remote lain, judul akan dimodifikasi oleh tuan rumah (dimana saya tidak terlalu terganggu). Tetapi setelah saya keluar dari koneksi, judul yang diubah tetap ada. Apakah ada cara untuk memperbaikinya? pada dasarnya saya ingin judul tetap untuk terminal saya ketika beroperasi secara lokal.

Saya terutama menggunakan terminal dan terminator xfce di bawah CentOS atau Debian. Terima kasih.

EDIT

Kehalusan lainnya adalah bahwa, alih-alih memiliki semua terminal dengan nama yang sama, saya lebih suka memiliki kebebasan untuk mengedit judul mereka secara langsung tetapi hanya melarang sesi SSH dari memodifikasi apa yang saya edit.

nye17
sumber

Jawaban:

6

Saya tidak tahu tentang judul jendela, tetapi saya telah berusaha agar sistem saya melakukan sesuatu untuk mengakhiri sesi ssh — sebenarnya, setelah mengakhiri sesi ssh. Singkatnya: tidak berfungsi seperti itu. Pada dasarnya Anda memiliki tiga pilihan:

  1. Tulis pembungkus di sekitar ssh, yaitu, skrip shell yang dapat dieksekusi bernama sshyang lebih diutamakan /usr/bin/sshdalam $ PATH Anda yang berisi baris exec /usr/bin/ssh $@di suatu tempat di tengahnya. Ini memungkinkan Anda untuk membuat shell Anda melakukan beberapa hal sebelum dan sesudah binary ssh yang efektif dijalankan, sambil menjaga kepala tetap minimum.

  2. Tulis tambalan terhadap sumber SSH pilihan Anda untuk memberikan Anda hook pembersihan yang mengeksekusi perintah shell yang dikirimkan melalui commandline atau pengaturan konfigurasi. Itu yang kita inginkan.

  3. Telah PROMPT_COMMANDmengevaluasi keluaran history. Pada dasarnya pendekatan yang lebih umum dan lebih jelek untuk 1.

Bananguin
sumber
pada dasarnya saya hanya menulis skrip sederhana untuk mengambil judul saat ini dan menyimpannya sebelum sesi SSH, lalu memulihkan judul setelahnya.
nye17
4
@ nye17 Bisakah Anda memposting skrip solusi yang Anda gunakan?
Reg Mem
Saya memposting skrip solusi saya di bawah ini. harus cocok dengan apa yang @ nye17 lakukan. unix.stackexchange.com/a/341277/112190
phyatt
7

Solusi: tambahkan beberapa fungsi ~ / .bashrc untuk melakukan sesuatu setelah perintah ssh dan su

function title()
{
   # change the title of the current window or tab
   echo -ne "\033]0;$*\007"
}

function ssh()
{
   /usr/bin/ssh "$@"
   # revert the window title after the ssh command
   title $USER@$HOST
}

function su()
{
   /bin/su "$@"
   # revert the window title after the su command
   title $USER@$HOST
}

Catatan: mulai ulang bash setelah pengeditan ke ~ / .bashrc

Contoh:

# title is "user1@boxA"
ssh boxB  # auto changes title while on boxB to "user1@boxB"
exit
# title returns back to "user1@boxA" because of our title call in ssh()
su - user2 # auto changes title while switched user to user2: "user2@boxA"
exit
# title returns back to "user1@boxA" because of our title call in su()

Semoga itu bisa membantu.

phyatt
sumber
sedikit tidak akurat untuk mengatakan revertkarena Anda tidak memeriksa untuk melihat apa itu sebelumnya ... jika Anda bertanya dan menyimpan nilai sebelumnya ;-)
nhed
4

Konfigurasikan dotfile shell lokal Anda (misalnya $PROMPT_COMMANDdalam ~/.bashrc) untuk mengatur judul terminal dengan tepat, menggunakan mekanisme yang sama.

Sebagai contoh:

export PROMPT_COMMAND="printf '\e]0;bash\7\n'"
Ignacio Vazquez-Abrams
sumber
1. prompt_command tidak ada hubungannya dengan judul jendela terminal Anda, kan? Saya telah menyiapkan command_command tetapi hanya untuk prompt. 2. Saya masih membutuhkan mekanisme untuk mengingat dan mengaktifkan pengaturan lokal saya setelah keluar dari ssh logging.
nye17
Perintah prompt hanya memancarkan urutan keluar yang diperlukan untuk terminal Anda untuk mengubah nama bilah judulnya. :)
Reinstate Monica
tetapi saya juga menginginkan kebebasan untuk mengubah nama terminal apa pun yang saya inginkan, daripada meminta setiap sesi dengan nama yang sama. Dalam prakteknya, saya pada dasarnya mengedit manual judul terminal dan berharap terminal tetap memiliki judul tetap bahkan setelah SSH login / logout. Apakah masuk akal?
nye17
1
Jadi, letakkan judul yang diinginkan dalam variabel, dan hasilkan itu.
Ignacio Vazquez-Abrams
Jika Anda menggunakan urutan pelarian terminal ini untuk menetapkan judul nol (misalnya, export PROMPT_COMMAND="printf '\e]0;\7\n'"), maka emulator terminal Anda dapat mengatur judul jendela sesuai keinginan. Ketika Anda ssh ke host jarak jauh yang menetapkan judul terminal, emulator terminal Anda akan menunjukkan judul itu, dan ketika Anda keluar, itu akan kembali menggunakan judulnya sendiri. Setidaknya, begitulah cara kerja aplikasi Terminal macOS.
claymation
3

Tambahkan baris-baris ini ke ~ / .bashrc

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"

    ;;
*)
    ;;
esac

bekerja dengan baik dengan linux berbasis debian

hrushikesh
sumber
1
ITU tidak menetapkan judul ...
Bananguin
Biasanya lebih baik digunakan PROMPT_COMMANDdaripada menggunakan PS1, karena Anda tidak harus menyertakan tanda \[ \]kurung dan dapat menghilangkan beberapa kutipan.
Chris Halaman
2

Salah satu solusinya adalah mengubah variabel terminal ke vt100 sebelum ssh'ing, misalnya dijalankan

export TERM=vt100

Ini berfungsi karena biasanya skrip inisialisasi melihat variabel terminal dan hanya mengubahnya dengan judulnya itu xterm. Anda kehilangan layar alternatif, warna dan mungkin beberapa fitur mewah lain yang mungkin Anda hargai atau tidak Anda hargai.

Jika Anda ingin menjaga terminal lokal sebagai xterm, alias ssh untuk mengubah variabel terminal dengan cepat, seperti

alias ssh='TERM=vt100 /usr/bin/ssh'
Viljo Viitanen
sumber
itu mengubah cara hal ditampilkan. warna tidak ditampilkan
npk
0

Saya memperbaiki masalah ini dengan menambahkan ini ke PS1 saya di file .bashrc saya.

\[\e]2;\u@\H:\w\a\]

Karenanya seluruh baris terlihat seperti ini (Saya telah menyesuaikan PS saya !:

export PS1='\[\e]2;\u@\H:\w\a\]\n($LOGNAME@$HOSTNAME) \t\n[$PWD]: '

Saya harap itu membantu orang lain.

cwiggs
sumber
Jika Anda menggunakan urutan pelarian terminal ini untuk menetapkan judul nol (misalnya, export PS1='\[\033]0;\007\]\h:\W \u\$ '), maka emulator terminal Anda dapat mengatur judul jendela sesuai keinginan. Ketika Anda ssh ke host jarak jauh yang menetapkan judul terminal, emulator terminal Anda akan menunjukkan itu, dan ketika Anda logout, ia akan kembali menggunakan judulnya sendiri. Setidaknya, begitulah cara kerja aplikasi Terminal macOS.
claymation
0

Jawaban lain tidak akan bekerja untuk saya ketika saya keluar dari SSH, tetapi membuat saya dekat. Menambahkan setw automatic-rename berfungsi ketika saya keluar dari sesi ssh jarak jauh sehingga otomatis mengganti nama dan tidak harus keluar dari jendela lagi untuk mengatur ulang. [Jan. 2018 - Debian 9]

ssh() {
tmux rename-window "$*"
command ssh "$@"
tmux setw automatic-rename
}
solstis
sumber