다른 시스템에 SSH 원격 로깅 후 터미널 제목 수정


18

지금은 한 줄의 펄 코드를 사용하여 터미널 표시 줄의 제목을 변경하고 있습니다.

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

그러나 다른 원격 컴퓨터로 ssh 한 후에는 제목이 호스트에 의해 수정됩니다 (특히 귀찮게하지 않음). 그러나 연결을 종료 한 후에도 수정 된 제목이 남아 있습니다. 이 문제를 해결하는 방법이 있습니까? 본질적으로 로컬에서 작동 할 때 터미널의 제목을 고정하고 싶습니다.

저는 주로 CentOS 또는 Debian에서 xfce 터미널과 터미네이터를 사용합니다. 감사.

편집하다

또 다른 미묘한 점은 모든 터미널의 이름이 동일하기 때문에 제목을 즉시 편집 할 수는 있지만 SSH 세션에서 내가 편집 한 내용을 수정하는 것을 금지한다는 것입니다.

답변:


6

창 제목에 대해서는 잘 모르지만 실제로 ssh 세션을 종료 한 후 시스템에서 ssh 세션을 종료하는 작업을 수행하려고했습니다. 요컨대, 그것은 그렇게 작동하지 않습니다. 기본적으로 세 가지 선택이 있습니다.

  1. ssh 주위에 래퍼를 작성하십시오. 즉, 중간에 어딘가에 라인을 포함하는 $ PATH에서 ssh우선 하는 실행 쉘 스크립트를 작성 /usr/bin/ssh하십시오 exec /usr/bin/ssh $@. 이를 통해 유효 ssh 바이너리가 실행되기 전과 후에 셸에서 일부 작업을 수행 할 수 있으며 동시에 오버 헤드를 최소화 할 수 있습니다.

  2. 선택한 SSH 소스에 대해 패치를 작성하여 명령 행 또는 일부 구성 설정을 통해 전달 된 쉘 명령을 실행하는 정리 후크를 제공하십시오. 그것이 우리가 원하는 것입니다.

  3. 유무는 PROMPT_COMMAND의 출력을 평가 history. 기본적으로 1에 대한보다 일반적이고 추악한 접근법.


기본적으로 방금 현재 제목을 가져 와서 SSH 세션 전에 저장 한 다음 나중에 제목을 복구하는 간단한 스크립트를 작성했습니다.
nye17

4
@ nye17 사용한 솔루션 스크립트를 게시 할 수 있습니까?
Reg Mem

아래에 솔루션 스크립트를 게시했습니다. @ nye17이 한 것과 밀접하게 일치해야합니다. unix.stackexchange.com/a/341277/112190
phyatt

7

해결책 : ssh 및 su 명령 다음 에 작업을 수행하기 위해 ~ / .bashrc 함수를 추가하십시오.

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
}

참고 : ~ / .bashrc를 편집 한 후 bash를 다시 시작하십시오.

예:

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

희망이 도움이됩니다.


revert이전의 값을 확인하지 않았으므로 말하기가 약간 부정확합니다 ... 이전 값을 쿼리하고 저장 한 경우 ;-)
nhed

4

동일한 메커니즘을 사용하여 터미널 제목을 적절하게 설정하도록 로컬 쉘 도트 파일 (예 : $PROMPT_COMMANDin ~/.bashrc)을 구성하십시오 .

예를 들면 다음과 같습니다.

export PROMPT_COMMAND="printf '\e]0;bash\7\n'"

1. prompt_command는 터미널 창의 제목과 관련이 없습니다. prompt_command를 설정했지만 프롬프트 전용입니다. 2. 여전히 ssh 로깅을 종료 한 후 로컬 설정을 기억하고 활성화하는 메커니즘이 필요합니다.
nye17 2016 년

prompt 명령은 터미널이 제목 표시 줄의 이름을 바꾸는 데 필요한 이스케이프 시퀀스를 생성합니다. :)
Monica Monica 복원

그러나 모든 단일 세션을 동일한 이름으로 사용하지 않고 원하는 터미널의 이름을 자유롭게 바꿀 수 있기를 바랍니다. 실제로 기본적으로 터미널 제목 매뉴얼을 편집하고 SSH 로그인 / 로그 아웃 후에도 터미널이 고정 된 제목을 유지하기를 바랍니다. 말이 되나요?
nye17

1
그런 다음 원하는 제목을 변수에 넣고 출력하십시오.
Ignacio Vazquez-Abrams

이 터미널 이스케이프 시퀀스를 사용하여 null 제목 (예 export PROMPT_COMMAND="printf '\e]0;\7\n'":)을 설정하면 터미널 에뮬레이터가 창 제목을 적절하게 설정할 수 있습니다. 터미널 제목을 설정하는 원격 호스트로 ssh하면 터미널 에뮬레이터가 해당 제목을 표시하고 로그 아웃하면 자체 제목을 사용하여 되돌아갑니다. 적어도 macOS 터미널 앱이 작동하는 방식입니다.
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

데비안 기반 리눅스와 잘 작동


1
IT는 제목을 설정하지 않습니다 ...
Bananguin

대괄호 를 포함 할 필요가없고 인용 부호를 제거 할 수 있으므로 일반적으로을 사용하는 PROMPT_COMMAND대신 사용 하는 것이 좋습니다 . PS1\[ \]
Chris 페이지

2

한 가지 해결책은 ssh'ing 전에 터미널 변수를 vt100으로 변경하는 것입니다.

export TERM=vt100

이것은 일반적으로 초기화 스크립트가 터미널 변수를보고 xterm이라는 제목으로 만 변경하기 때문에 작동합니다. 대체 화면, 색상 및 기타 멋진 기능을 잃어 버릴 수도 있습니다.

로컬 터미널을 xterm으로 유지하려면 alias ssh를 사용하여 터미널 변수를 즉석에서 변경하십시오.

alias ssh='TERM=vt100 /usr/bin/ssh'

사물이 표시되는 방식을 변경합니다. 색상이 표시되지 않음
npk

0

내 .bashrc 파일의 PS1에 이것을 추가 하여이 문제를 해결했습니다.

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

따라서 전체 줄은 다음과 같습니다 (PS를 사용자 정의했습니다! :

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

나는 그것이 다른 사람들을 돕기를 바랍니다.


이 터미널 이스케이프 시퀀스를 사용하여 null 제목 (예 export PS1='\[\033]0;\007\]\h:\W \u\$ ':)을 설정하면 터미널 에뮬레이터가 창 제목을 적절하게 설정할 수 있습니다. 터미널 제목을 설정하는 원격 호스트로 ssh하면 터미널 에뮬레이터가이를 표시하고 로그 아웃하면 자체 제목을 사용하여 되돌아갑니다. 적어도 macOS 터미널 앱이 작동하는 방식입니다.
claymation

0

SSH를 종료하면 다른 답변이 작동하지 않지만 닫았습니다. 원격 SSH 세션을 종료하면 setw 자동 이름 바꾸기를 추가하면 자동으로 이름이 바뀌고 더 이상 창을 종료하지 않아도 재설정 할 수 있습니다. [1 월. 2018-데비안 9]

ssh() {
tmux rename-window "$*"
command ssh "$@"
tmux setw automatic-rename
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.