Napraw tytuł terminala po zdalnym logowaniu SSH na innym komputerze

18

teraz używam jednowierszowego kodu perla do zmiany tytułów moich listew zaciskowych,

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

ale za każdym razem, gdy przesyłam ssh na inną zdalną maszynę, tytuł będzie modyfikowany przez hosta (przez co nie jestem szczególnie zainteresowany). Ale po wyjściu z połączenia zmodyfikowany tytuł pozostaje. Czy istnieje sposób, aby to naprawić? zasadniczo chcę mieć stały tytuł dla moich terminali, gdy działam lokalnie.

Używam przede wszystkim terminala i terminatora xfce w CentOS lub Debian. Dzięki.

EDYTOWAĆ

Inną subtelnością jest to, że raczej mając wszystkie terminale o tej samej nazwie, wolę mieć swobodę edytowania tytułów w locie, ale zabraniam jedynie sesji SSH modyfikowania tego, co edytowałem.

nye17
źródło

Odpowiedzi:

6

Nie wiem o tytułach okien, ale starałem się, aby mój system zrobił coś po zakończeniu sesji ssh - właściwie po zakończeniu sesji ssh. Krótko mówiąc: to tak nie działa. Zasadniczo masz trzy możliwości:

  1. Napisz opakowanie wokół ssh, tj. Wykonywalnego skryptu powłoki o nazwie, sshktóry ma pierwszeństwo /usr/bin/sshw $ PATH, który zawiera linię exec /usr/bin/ssh $@gdzieś pośrodku. Pozwala to na wykonanie przez powłokę pewnych czynności przed uruchomieniem efektywnego pliku binarnego ssh i po jego uruchomieniu, przy jednoczesnym ograniczeniu nakładu pracy do minimum.

  2. Napisz łatę do wybranych źródeł SSH, aby zapewnić hak czyszczenia, który wykonuje polecenie powłoki przekazane za pomocą wiersza polecenia lub innego ustawienia konfiguracji. Tego chcemy.

  3. Posiadane PROMPT_COMMANDocenić wyjście history. Zasadniczo bardziej ogólne i brzydkie podejście do 1.

Bananguin
źródło
w zasadzie właśnie napisałem prosty skrypt, aby pobrać bieżący tytuł i zapisać go przed sesją SSH, a następnie odzyskać tytuł.
nye17
4
@ nye17 Czy możesz opublikować używany skrypt rozwiązania?
Reg Mem
Poniżej opublikowałem swój skrypt rozwiązania. powinno być ściśle dopasowane do tego, co zrobił @ nye17. unix.stackexchange.com/a/341277/112190
phyatt
7

Rozwiązanie: dodaj kilka funkcji ~ / .bashrc, aby zrobić coś po poleceniach ssh i 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
}

Uwaga: uruchom ponownie bash po edycjach ~ / .bashrc

Przykład:

# 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()

Mam nadzieję, że to pomaga.

phyatt
źródło
nieco niedokładne do powiedzenia, revertponieważ nie sprawdzasz, co to było wcześniej ... jeśli zapytałeś i zapisałeś poprzednią wartość ;-)
nhed
4

Skonfiguruj lokalny plik kropkowy powłoki (np $PROMPT_COMMAND w ~/.bashrc) zawiera tytuł terminala w odpowiedni sposób, przy użyciu tego samego mechanizmu.

Na przykład:

export PROMPT_COMMAND="printf '\e]0;bash\7\n'"
Ignacio Vazquez-Abrams
źródło
1. prompt_command nie ma nic wspólnego z tytułem okna twojego terminalu, prawda? Mam skonfigurowaną komendę prompt_poland, ale tylko dla monitu. 2. Nadal potrzebuję mechanizmu do zapamiętania i aktywacji mojego lokalnego ustawienia po wyjściu z logowania ssh.
nye17
Komenda zachęty po prostu emituje sekwencję ucieczki, aby terminal mógł zmienić nazwę paska tytułu. :)
Przywróć Monikę
ale chcę także wolności zmiany nazwy dowolnego terminala, a nie każdej sesji o tej samej nazwie. W praktyce w zasadzie edytuję podręcznik tytułu terminala i mam nadzieję, że terminal pozostanie w posiadaniu ustalonego tytułu nawet po zalogowaniu / wylogowaniu SSH. Czy ma sens?
nye17
1
Więc wstaw żądany tytuł do zmiennej i wyślij go.
Ignacio Vazquez-Abrams,
Jeśli użyjesz tej sekwencji ucieczki terminala do ustawienia pustego tytułu (np. export PROMPT_COMMAND="printf '\e]0;\7\n'"), Wówczas emulator terminalu może ustawić tytuł okna według własnego uznania. Po ssh do zdalnego hosta, który ustawia tytuł terminala, emulator terminala wyświetli ten tytuł, a po wylogowaniu powróci do używania własnego tytułu. Przynajmniej tak działa aplikacja terminala macOS.
Claymation
3

DODAJ te linie do ~ / .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

działa dobrze z linuxami opartymi na Debianie

hrushikesh
źródło
1
IT jednak nie ustanawia tytułu ...
Bananguin,
Zwykle lepiej jest używać PROMPT_COMMANDzamiast używać PS1, ponieważ nie trzeba \[ \]dodawać nawiasów i może wyeliminować niektóre cytowania.
Chris Page
2

Jednym z rozwiązań jest zmiana zmiennej terminalnej na vt100 przed ssh'ing, np. Run

export TERM=vt100

Działa to, ponieważ zwykle skrypty inicjujące sprawdzają zmienną terminala i zmieniają ją tylko tak, by była xterm. Tracisz alternatywne ekrany, kolory i może jakieś inne fantazyjne funkcje, które możesz lub nie możesz docenić.

Jeśli chcesz zachować terminal lokalny jako xterm, użyj aliasu ssh, aby zmienić zmienną terminala w locie, np

alias ssh='TERM=vt100 /usr/bin/ssh'
Viljo Viitanen
źródło
zmienia sposób wyświetlania rzeczy. kolory nie są wyświetlane
npk
0

Rozwiązałem ten problem, dodając go do mojego PS1 w pliku .bashrc.

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

Dlatego cała linia wygląda tak (dostosowałem swoje PS !:

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

Mam nadzieję, że to pomaga innym.

cwiggs
źródło
Jeśli użyjesz tej sekwencji ucieczki terminala do ustawienia pustego tytułu (np. export PS1='\[\033]0;\007\]\h:\W \u\$ '), Wówczas emulator terminalu może ustawić tytuł okna według własnego uznania. Gdy ssh do zdalnego hosta, który ustawia tytuł terminala, emulator terminala to pokaże, a po wylogowaniu powróci do używania własnego tytułu. Przynajmniej tak działa aplikacja terminala macOS.
Claymation
0

Inne odpowiedzi nie działałyby dla mnie, gdy wychodzę z SSH, ale zbliżyły mnie. Dodanie automatycznej zmiany nazwy setw działa, kiedy wychodzę ze zdalnej sesji ssh, więc zmienia ona nazwę automatycznie i nie muszę już wychodzić z okna, aby zresetować. [Styczeń 2018 - Debian 9]

ssh() {
tmux rename-window "$*"
command ssh "$@"
tmux setw automatic-rename
}
solstis
źródło