Làm thế nào bạn có thể thay đổi dòng trạng thái màn hình GNU dựa trên tên máy chủ?


31

Tôi có một thư mục chung được chia sẻ tự động thông qua NFS trên tất cả các máy chủ UNIX mà tôi đăng nhập. Tôi muốn có một .screenrc duy nhất (ví dụ) đặt tên máy chủ trong dòng hardstatus bằng một màu khác để cho biết khi tôi đăng nhập vào sản xuất so với phát triển; tên máy chủ của chúng tôi sao cho có thể dễ dàng thực hiện điều này thông qua việc sử dụng khớp mẫu.

Có cách nào để đưa các câu lệnh có điều kiện vào .screenrc không? Một grep nhanh của trang người đàn ông dường như không tiết lộ bất cứ điều gì rõ ràng.

CHỈNH SỬA:

Để làm rõ, tôi đã có một dòng trạng thái cứng tùy chỉnh; Tôi muốn thay đổi một số màu / trường được hiển thị dựa trên tên máy chủ mà màn hình được gọi. Tôi đã có một cái gì đó như thế này cho PS1 của mình, tuy nhiên tôi thà làm điều này trong dòng trạng thái màn hình khi tôi chuyển từ các máy chủ này sang bộ định tuyến / bộ chuyển mạch, điều này không cho phép tôi thực hiện bất kỳ thao tác nhắc nhở nào. Bằng cách này, tôi có thể có một cửa sổ để sản xuất và một cửa sổ để phát triển, với màu của dòng trạng thái màn hình cho tôi biết tôi đang xem cái nào trong nháy mắt.


Tên máy chủ của màn hình đang chạy? Hoặc tên máy chủ của 'cửa sổ' màn hình cụ thể đó đang sử dụng?
Kyle Brandt

@Kyle: tên máy chủ của màn hình đang chạy. Xem câu hỏi cập nhật để biết thêm một chút chi tiết.
Murali Suriar

Câu trả lời:


13

Tôi thấy có hai cách để làm điều này, cách đầu tiên là tạo một tệp .screenrc theo máy chủ.
Giống như .screenrc_serverA, .screenrc_serverB...
Trong tập lệnh khởi động hệ vỏ của bạn, đặt SCREENRC thành một cái gì đó giống như .screenrc_`hostname`
Tất nhiên bạn có thể sử dụng lệnh nguồn của màn hình để bao gồm một cái gì đó giống như .screenrc_defaulttrong mỗi tệp .screenrc_ chế độ sao cho chúng chỉ chứa một dòng chú thích / hardstatus chứ không phải Toàn bộ cấu hình mỗi lần.

Cách thứ hai sẽ là thực thi các lệnh như screen -X hardstatus lastline ...(sử dụng if tests để thực thi lệnh với giá trị khác nhau cho ... tùy thuộc vào tên máy chủ) trong tập lệnh khởi động shell của bạn. Khi bạn đăng nhập vào máy chủ, màn hình -X sẽ không làm gì cả vì màn hình sẽ không được khởi chạy, nhưng mỗi lần bạn mở một cửa sổ mới trên màn hình, phần cứng sẽ được cập nhật.

Tất nhiên, giải pháp thứ 1 tốt hơn bởi vì giải pháp thứ hai sẽ làm mới dòng hardstatus mỗi khi bạn mở một cửa sổ tin tức có thể vô dụng vì tên máy chủ sẽ không thay đổi.


Khi bạn đọc ".screenrc_hostname" hãy đọc ".screenrc_ hostname". Tôi gặp vấn đề khi đưa `vào bài đăng
bán kính

Nice - Tôi đã bỏ lỡ phần trong trang man về biến môi trường SCREENRC được tìm kiếm đầu tiên.
Murali Suriar

@radius Tôi đã có thể thêm backticks bằng đề xuất này: meta.stackexchange.com/a/70679/167351
Bruno Bronosky

16

@radius là điểm nổi bật với điều SCREENRC, nhưng nó không phải là một câu trả lời rất đầy đủ, vì vậy tôi sẽ giải thích

~ / .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"

* Luôn sử dụng các bài kiểm tra mới !

Một từ về các nhân vật thoát

Cách thích hợp để bao gồm màu sắc trong các tập lệnh là với tham số, không thoát các ký tự. Nhân vật thoát của bạn là cụ thể cho thiết bị đầu cuối của bạn. Lệnh tput là thiết bị đầu cuối nhận biết. Tôi đã viết điều này khi tôi cần để có được sự ưa thích trong các kịch bản của mình:

~ / bin / MÀU SẮC.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

Tôi cũng đã thực hiện một kịch bản để chứng minh việc sử dụng thuật ngữ. Bạn có thể lấy nó từ ý chính này.

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


1
Tôi tìm thấy hai "mâu thuẫn". Đầu tiên là thực tế cũng setafsử dụng nền , mặc dù nó phải là setab( b thay vì f ) và thứ hai là sử dụng 9làm mặc định không hoạt động đối với tôi, có thể vì phiên bản tput không chuẩn (cả trong trường hợp của anh ta hoặc của tôi, tôi chỉ đơn giản là không biết và nó không thực sự quan trọng lắm)
Shadow

@Shadow cảm ơn vì đã bắt được điều đó. Tôi sửa nó rồi.
Bruno Bronosky

5

Chỉ cần đặt nó trong .screenrc của bạn là biến hardstatus. Miễn là bạn đang sử dụng một biến như% H cho tên máy chủ, nó sẽ thay đổi để khớp với bất kỳ tên máy chủ nào bạn làm việc trên nó.

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

Sẽ cung cấp cho bạn một dòng trạng thái ở dưới cùng trông giống như

ví dụ màn hình cứng

tên máy chủ là màu đỏ trên màu đen, thời gian là màu xanh lá cây trên màu đen, ngày là màu vàng trên màu đen. cửa sổ được đánh dấu * là cửa sổ hiện tại, được hiển thị bằng văn bản màu xanh trên nền trắng. cửa sổ được đánh dấu - là cửa sổ hoạt động trước đó, hiển thị văn bản màu trắng trên nền đen. cửa sổ 1, ở trên, không phải là hiện tại hoặc trước đó và sẽ được hiển thị màu trắng trên nền đen. các khả năng khác sẽ hiển thị cho bạn những người dùng khác được gắn vào cửa sổ, màu trắng trên nền đen và được đánh dấu bằng +.

có hiển thị thời gian cũng giúp giữ liên lạc nếu bạn ssh đến các máy chủ từ xa để chạy màn hình, vì thời gian thay đổi mỗi phút sẽ giữ cho phiên của bạn tồn tại, ngay cả khi vỏ không hoạt động ở phía xa.


Điều đó không cho phép tôi định dạng có điều kiện tên máy chủ dựa trên cấu trúc của nó (ví dụ: bất kỳ tên máy chủ nào kết thúc bằng '-dev' màu xanh lam, bất kỳ tên máy chủ nào kết thúc bằng '-prod' màu đỏ.)
Murali Suriar

à if only screenrc if-statement hỗ trợ regex.
Tim Kennedy

4

Bạn có thể tô màu dòng trạng thái từ trong tập lệnh backtick bằng cách in \005{..r}hoặc tương tự ( rđối với màu đỏ, v.v. giống như trong .screenrcchính nó), vì vậy bạn có thể băm tên máy chủ để đến một số hoặc chỉ cần đặt một loạt các câu lệnh có điều kiện màu sắc Ví dụ: đây là một tập lệnh để thay đổi màu sắc và in tên máy chủ để sử dụng trong màn hình:

#!/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

Sau đó, bạn thêm một mục nhập cho tập lệnh này vào .screenrcvà tham chiếu nó trong phần cứng hoặc chú thích là% 4`:

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

Điều này giả định tên máy chủ không có khả năng thay đổi, do đó thời gian chờ và hiệu lực là 1 giờ (3600 giây); các bit xung quanh lệnh gọi tới backtick chỉ cần đặt ngày ở đầu dòng và thời gian sau tên máy chủ.

Bạn thậm chí có thể sử dụng cơ chế này để tô màu đầu ra của tập lệnh tùy thuộc vào giá trị của mức sạc pin, tải hệ thống hoặc nhiệt độ, giả sử bạn có quyền truy cập vào các giá trị có liên quan từ tập lệnh shell.


+1 để đề cập đến screenlối thoát \005- theo cách đó, toàn bộ định dạng có điều kiện có thể được đưa vào tập lệnh shell dễ đọc hơn nhiều thay vì các câu lệnh đã khó phân tích caption. hardstatuschỉ thị màn hình.
ckujau

1

Nếu bạn muốn tránh nhiều kịch bản, bạn có thể thử điều này:

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

grep sẽ chỉ in tên máy chủ nếu nó khớp với "prod", vì vậy bạn có thể cắm nó vào backtick và %?cấu trúc. Viola!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.