호스트 이름을 기준으로 GNU 화면 상태 줄을 어떻게 변경할 수 있습니까?


31

로그인 한 모든 UNIX 서버에서 NFS를 통해 자동 마운트되는 공유 홈 디렉토리가 있습니다. 예를 들어, hardstatus 라인에 호스트 이름을 다른 색상으로 넣어서 프로덕션 대 개발에 로그온 할 때를 나타내는 단일 .screenrc를 갖고 싶습니다. 호스트 이름은 패턴 일치를 사용하여 쉽게 수행 할 수 있도록합니다.

조건문을 .screenrc에 넣는 방법이 있습니까? 매뉴얼 페이지의 빠른 grep은 명백한 것을 나타내지 않는 것 같습니다.

편집하다:

명확히하기 위해 이미 사용자 지정 하드 상태 줄이 있습니다. 화면이 호출되는 호스트 이름을 기반으로 표시되는 일부 색상 / 필드를 변경하고 싶습니다. 이미 PS1에 대해 이와 같은 것을 가지고 있지만 이러한 호스트에서 라우터 / 스위치로 이동하면 화면 상태 표시 줄 에서이 작업을 수행하므로 프롬프트 색상 지정을 수행 할 수 없습니다. 이렇게하면 화면 상태 표시 줄의 색상으로 어느 창을 한 눈에 볼 수 있는지 생산 용 창 하나와 개발 용 창 하나를 가질 수 있습니다.


화면이 실행되는 시스템의 호스트 이름? 아니면 특정 화면 '창'의 호스트 이름을 사용하고 있습니까?
Kyle Brandt

@Kyle : 화면이 실행되는 시스템의 호스트 이름. 좀 더 자세한 내용은 업데이트 된 질문을 참조하십시오.
Murali Suriar

답변:


13

이 작업을 수행하는 두 가지 방법이 있습니다. 첫 번째 방법은 호스트별로 .screenrc 파일을 만드는 것입니다.
마찬가지로 .screenrc_serverA, .screenrc_serverB...
쉘 시작 스크립트에서 같은 것으로 SCREENRC를 설정 .screenrc_`hostname`
물론 같은 것을 포함하는 화면의 소스 명령을 사용할 수 있습니다 중 .screenrc_default그래서 그들은 단지 자막 / hardstatus 라인이 아닌를 포함 ... 파일을 각 사용자 지정 .screenrc_의를 매번 전체 구성.

두 번째 방법은 screen -X hardstatus lastline ...쉘 시작 스크립트에서 (호스트 이름에 따라 다른 값으로 명령을 실행하기 위해 if 테스트를 사용하는 경우) 명령을 실행하는 것입니다. 서버에 로그온 할 때 화면이 아직 시작되지 않기 때문에 화면 -X는 아무 것도 수행하지 않지만 화면에서 새 창을 열 때마다 하드 상태가 업데이트됩니다.

물론 첫 번째 솔루션은 호스트 이름이 변경되지 않으므로 쓸모없는 뉴스 창을 열 때마다 두 번째 솔루션이 hardstatus 라인을 새로 고치므로 더 좋습니다.


".screenrc_hostname"을 읽으면 ".screenrc_"를 읽으십시오 hostname. 게시물에`를 포함시키는 데 문제가 있습니다.
반경

Nice-맨 페이지에서 SCREENRC 환경 변수가 먼저 검색되는 부분을 놓쳤습니다.
Murali Suriar 2016 년

: @radius 나는이 제안을 사용하여 역 따옴표 추가 할 수 있었다 meta.stackexchange.com/a/70679/167351
브루노 Bronosky

16

@radius는 SCREENRC와 관련이 있지만 매우 완전한 대답은 아니 었으므로 자세히 설명하겠습니다 ...

~ / .bashrc

# Strip down a FQDN
hostname="$(hostname | sed 's/\..*//')"
# Use the case pattern for server groups
case "$hostname" in
    mario|luigi|toad|peach|koopa*|bowser) export SCREENRC=~/.screenrc_prod;;
    dev*|vm*)  export SCREENRC=~/.screenrc_dev;;
esac
# Use condensed bash "new test*" notation to override for specific servers
# e.g. ~/.screenrc_bowser would get used instead of ~/.screenrc_prod
[[ -f "~/.screenrc_$hostname" ]] && export SCREENRC="~/.screenrc_$hostname"

* 항상 새로운 테스트를 사용하십시오 !

탈출 문자에 관한 단어

스크립트에 색상을 포함시키는 올바른 방법은 이스케이프 문자가 아닌 tput입니다. 이스케이프 문자는 터미널에 따라 다릅니다. tput 명령은 터미널을 인식합니다. 나는 스크립트에서 화려해야 할 때 이것을 썼다.

~ / bin / COLORS.sh

GT_RESET=$(   tput sgr0)  # Reset all attributes
GT_BRIGHT=$(  tput bold)  # Set “bright” attribute
GT_DIM=$(     tput dim)   # Set “dim” attribute (normal/non-bright)
GT_ULINE=$(   tput smul)  # Set “underscore” (underlined text) attribute
GT_BLINK=$(   tput blink) # Set “blink” attribute
GT_INVERSE=$( tput rev)   # Set “inverse” attribute
GT_HIDDEN=$(  tput invis) # Set “hidden” attribute

FG_BLACK=$(   tput setaf 0) #foreground to color #0 - black
FG_RED=$(     tput setaf 1) #foreground to color #1 - red
FG_GREEN=$(   tput setaf 2) #foreground to color #2 - green
FG_YELLOW=$(  tput setaf 3) #foreground to color #3 - yellow
FG_BLUE=$(    tput setaf 4) #foreground to color #4 - blue
FG_MAGENTA=$( tput setaf 5) #foreground to color #5 - magenta
FG_CYAN=$(    tput setaf 6) #foreground to color #6 - cyan
FG_WHITE=$(   tput setaf 7) #foreground to color #7 - white

BG_BLACK=$(   tput setab 0) #background to color #0 - black
BG_RED=$(     tput setab 1) #background to color #1 - red
BG_GREEN=$(   tput setab 2) #background to color #2 - green
BG_YELLOW=$(  tput setab 3) #background to color #3 - yellow
BG_BLUE=$(    tput setab 4) #background to color #4 - blue
BG_MAGENTA=$( tput setab 5) #background to color #5 - magenta
BG_CYAN=$(    tput setab 6) #background to color #6 - cyan
BG_WHITE=$(   tput setab 7) #background to color #7 - white

또한 tput 사용법을 보여주는 스크립트를 만들었습니다. 이 요지에서 얻을 수 있습니다.

참조 :
http://www.ibm.com/developerworks/aix/library/au-learningtput/?S_TACT=105AGY06
http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html


1
두 개의 "일관되지 않음"이 발견되었습니다. 첫 번째는 배경에 대해서도 사용된다는 사실 setaf이지만 setab( f 대신 b 이어야 함 ) 두 번째 는 기본값으로 사용 하는 것이 효과가 없다는 것입니다 .tput-version이 표준이 아니기 때문에 그의 경우 또는 내 경우, 나는 단순히 모른다 그리고 그것은별로 중요하지 않습니다)9
Shadow

@Shadow 고맙습니다. 나는 그것을 고쳤다.
Bruno Bronosky

5

.screenrc에서 hardstatus 변수로 설정하십시오. 호스트 이름에 % H와 같은 변수를 사용하는 한 작업하는 모든 호스트 이름과 일치하도록 변경됩니다.

hardstatus alwayslastline "%{rk}%H %{gk}%c %{yk}%M%d %{wk}%?%-Lw%?%{bw}%n*%f %t%?(%u)%?%{wk}%?%+Lw%?"

하단에 다음과 같은 상태 표시 줄이 나타납니다.

화면 하드 상태 예

호스트 이름은 검은 색에 빨간색, 시간은 검은 색에 녹색, 날짜는 검은 색에 노란색입니다. *로 표시된 창은 현재 창이며 흰색 배경에 파란색 텍스트로 표시됩니다. -로 표시된 창은 이전에 활성화 된 창이며 흰색 텍스트는 검은 색입니다. 위의 창 1은 현재 또는 이전이 아니며 검은 색으로 흰색으로 표시됩니다. 다른 가능성은 창에 연결된 다른 사용자 (검은 색 바탕에 흰색)를 표시하고 +로 표시됩니다.

셸이 원격 쪽에서 유휴 상태 인 경우에도 1 분마다 시간을 변경하면 세션이 활성 상태로 유지되므로 시간 표시 기능을 사용하면 원격 서버에 ssh를 실행하여 화면을 실행하는 경우에도 활성 상태를 유지하는 데 도움이됩니다.


따라서 구조에 따라 호스트 이름을 조건부로 포맷 할 수 없습니다 (예 : 파란색으로 '-dev'로 끝나는 호스트 이름, 빨간색으로 '-prod'로 끝나는 호스트 이름)
Murali Suriar

아 screenrc if 문만 정규식을 지원하는 경우
Tim Kennedy

4

백틱 스크립트 내에서 상태 표시 줄을 색칠 \005{..r}하거나 유사한 방식 으로 인쇄 할 수 있습니다 (자체 r내부와 마찬가지로 빨간색 등의 경우 .screenrc). 호스트 이름을 해시하여 숫자에 도달하거나 여러 조건문을 설정할 수 있습니다 색깔. 예를 들어, 화면에서 사용할 색상을 변경하고 호스트 이름을 인쇄하는 스크립트는 다음과 같습니다.

#!/bin/bash
Red="\005{..r}"
Yellow="\005{..y}"
Green="\005{..g}"
Blue="\005{..b}"
Magenta="\005{..m}"
Cyan="\005{..c}"
White="\005{..w}"

case "$HOSTNAME" in
   lubuntu-eee)
      echo -e "$Magenta$HOSTNAME"
      ;;
   ubuntu-pc)
      echo -e "$Magenta$HOSTNAME"
      ;;
   *)
      echo -e "$Green$HOSTNAME"
esac

그런 다음이 스크립트에 대한 항목을에 추가 .screenrc하고 hardstatus 또는 캡션 내에서 % 4`로 참조하십시오.

backtick 4 3600 3600 /usr/local/bin/screen_hostname
caption always "%{.kc}%D %d.%m.%Y %=%{.kg} %4` %{.kc}%0c"

이는 호스트 이름이 변경되지 않을 것으로 가정하므로 시간 제한 및 유효 시간은 1 시간 (3600 초)입니다. 백틱 자체에 대한 호출을 둘러싼 비트는 라인의 시작 부분과 호스트 이름 다음의 시간에 날짜를 넣습니다.

쉘 스크립트에서 관련 값에 액세스 할 수 있다고 가정하면이 메커니즘을 사용하여 배터리 충전 레벨, 시스템로드 또는 온도의 값에 따라 스크립트 출력의 색상을 지정할 수 있습니다.


screen이스케이프 를 언급하면 ​​+ \0051-전체 조건부 서식을 이미 구문 분석하기 어려운 스크립트 대신 훨씬 더 읽기 쉬운 쉘 스크립트에 넣을 수 있습니다 caption. hardstatus화면 지시문.
ckujau

1

많은 스크립팅을 피하려면 다음을 시도하십시오.

backtick 5 99999 99999 grep prod /etc/hostname
caption always "%?%{.R.}%5`%:%H%?"

grep은 호스트 이름이 "prod"와 일치하는 경우에만 호스트 이름을 인쇄하므로이를 백틱 및 %?구문 에 연결할 수 있습니다 . 비올라!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.