Исправить заголовок терминала после удаленной регистрации SSH на другой машине

18

сейчас я использую однострочный perl-код для изменения заголовков моих терминалов,

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

но каждый раз после того, как я перехожу на другой удаленный компьютер, заголовок будет изменяться хостом (что меня особо не беспокоит). Но после выхода из соединения измененный заголовок остается. Есть ли способ это исправить? по сути, я хочу фиксированный заголовок для моих терминалов при работе локально.

В первую очередь я использую терминал и терминатор xfce под CentOS или Debian. Благодарю.

РЕДАКТИРОВАТЬ

Другая тонкость заключается в том, что вместо того, чтобы все терминалы имели одно и то же имя, я бы предпочел иметь свободу редактировать их заголовки на лету, но только запретил бы сеансу SSH изменять то, что я редактировал.

nye17
источник

Ответы:

6

Я не знаю о заголовках окон, но я пытался заставить мою систему что-то сделать при завершении сеанса ssh - фактически после завершения сеанса ssh. Короче говоря: это не работает так. В основном у вас есть три варианта:

  1. Напишите обертку вокруг ssh, то есть исполняемый скрипт оболочки с именем, sshкоторый имеет приоритет над /usr/bin/sshвашим $ PATH, который содержит строку exec /usr/bin/ssh $@где-то посередине. Это позволяет вашей оболочке выполнять некоторые действия до и после запуска эффективного двоичного файла ssh, сохраняя при этом минимальные накладные расходы.

  2. Напишите патч для источников SSH по вашему выбору, чтобы предоставить вам средство очистки, которое выполняет команду оболочки, переданную через командную строку или какой-либо параметр конфигурации. Это то, что мы хотим.

  3. Have PROMPT_COMMANDоценить выход history. В основном более общий и более уродливый подход к 1.

Bananguin
источник
в основном я написал простой скрипт, чтобы получить текущий заголовок и сохранить его перед сессией SSH, а затем восстановить заголовок.
nye17
4
@ nye17 Можете ли вы опубликовать свой сценарий решения, который вы использовали?
Reg Mem
Я разместил свой сценарий решения ниже. должно быть близко соответствует тому, что сделал @ nye17. unix.stackexchange.com/a/341277/112190
Phyatt
7

Решение: добавьте некоторые функции ~ / .bashrc, чтобы сделать что-то после команд ssh и 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
}

Примечание: перезапустите bash после редактирования в ~ / .bashrc

Пример:

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

Надеюсь, это поможет.

phyatt
источник
немного неточно сказать, revertпоскольку вы не проверяете, что было раньше ... если вы запросили и сохранили предыдущее значение tho ;-)
nhed
4

Сконфигурируйте ваш локальный файл точек оболочки (например, $PROMPT_COMMANDin ~/.bashrc), чтобы правильно установить заголовок терминала, используя тот же механизм.

Например:

export PROMPT_COMMAND="printf '\e]0;bash\7\n'"
Игнасио Васкес-Абрамс
источник
1. prompt_command не имеет ничего общего с заголовком окна вашего терминала, верно? Я настроил prompt_command, но только для приглашения. 2. Мне все еще нужен механизм для запоминания и активации моих локальных настроек после выхода из журнала ssh.
nye17
Команда prompt просто выдает необходимую escape-последовательность, чтобы ваш терминал переименовал свою строку заголовка. :)
Восстановить Монику
но мне также нужна свобода переименовывать любой терминал, который я хочу, вместо того, чтобы каждый сеанс имел одно и то же имя. На практике я в основном редактирую руководство по заголовку терминала и надеюсь, что терминал останется с фиксированным названием даже после входа / выхода из SSH. Имеет ли это смысл?
nye17
1
Затем поместите нужный заголовок в переменную и выведите его.
Игнасио Васкес-Абрамс
Если вы используете эту управляющую последовательность терминала для установки нулевого заголовка (например, export PROMPT_COMMAND="printf '\e]0;\7\n'"), то ваш эмулятор терминала может установить заголовок окна так, как считает нужным. Когда вы подключаетесь к удаленному хосту, который устанавливает заголовок терминала, ваш эмулятор терминала будет показывать этот заголовок, а когда вы выйдете из системы, он вернется к использованию своего собственного заголовка. По крайней мере, так работает приложение MacOS Terminal.
claymation
3

ДОБАВЬТЕ эти строки в ~ / .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

хорошо работает с Linux на основе Debian

hrushikesh
источник
1
Это не устанавливает заголовок, хотя ...
Bananguin
Обычно лучше использовать PROMPT_COMMANDвместо использования PS1, так как вам не нужно включать \[ \]скобки, и это может исключить некоторые цитаты.
Крис Пейдж
2

Одним из решений является изменение терминальной переменной на vt100 перед ssh'ом, например, запустить

export TERM=vt100

Это работает, потому что обычно скрипты инициализации смотрят на терминальную переменную и меняют только ее заголовок, если это xterm. Вы теряете альтернативные экраны, цвета и, возможно, некоторые другие необычные функции, которые вы можете или не можете оценить.

Если вы хотите сохранить локальный терминал как xterm, используйте псевдоним ssh для изменения терминальной переменной на лету, например

alias ssh='TERM=vt100 /usr/bin/ssh'
Вильо Виитанен
источник
это меняет способ отображения вещей. Цвета не показаны
НПК
0

Я исправил эту проблему, добавив ее в PS1 в моем файле .bashrc.

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

Поэтому вся строка выглядит так (я настроил свой PS !:

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

Я надеюсь, что это помогает другим.

cwiggs
источник
Если вы используете эту управляющую последовательность терминала для установки нулевого заголовка (например, export PS1='\[\033]0;\007\]\h:\W \u\$ '), то ваш эмулятор терминала может установить заголовок окна так, как считает нужным. Когда вы подключаетесь к удаленному хосту, который устанавливает заголовок терминала, ваш эмулятор терминала покажет это, а когда вы выйдете из системы, он вернется к использованию своего собственного заголовка. По крайней мере, так работает приложение MacOS Terminal.
claymation
0

Другие ответы не будут работать для меня, когда я выйду из SSH, но приблизили меня. Добавление setw Automatic-Rename работает, когда я выхожу из удаленного сеанса SSH, поэтому оно автоматически переименовывается и больше не нужно выходить из окна для сброса. [Январь 2018 - Debian 9]

ssh() {
tmux rename-window "$*"
command ssh "$@"
tmux setw automatic-rename
}
solstis
источник