คุณจะเปลี่ยนบรรทัดสถานะหน้าจอ GNU ตามชื่อโฮสต์ได้อย่างไร


31

ฉันมีโฮมไดเร็กตอรี่แชร์ที่ติดตั้งอัตโนมัติผ่าน NFS บนเซิร์ฟเวอร์ UNIX ทั้งหมดที่ฉันเข้าสู่ระบบ ฉันต้องการมี. screenrc อันเดียวที่ (ตัวอย่าง) วางชื่อโฮสต์ไว้ในบรรทัด hardstatus ในสีที่ต่างกันเพื่อระบุว่าเมื่อฉันเข้าสู่การผลิตเทียบกับการพัฒนา ชื่อโฮสต์ของเรานั้นสามารถทำได้อย่างง่ายดายผ่านการใช้การจับคู่รูปแบบ

มีวิธีการใส่คำสั่งเงื่อนไขลงใน. screenrc หรือไม่ grep ที่รวดเร็วของ man page ดูเหมือนจะไม่เปิดเผยอะไรที่ชัดเจน

แก้ไข:

เพื่อชี้แจงฉันมีบรรทัดสถานะฮาร์ดที่กำหนดเองแล้ว ฉันต้องการเปลี่ยนสี / ฟิลด์ที่แสดงตามชื่อโฮสต์ที่เรียกใช้หน้าจอ ฉันมีสิ่งนี้สำหรับ PS1 ของฉันอยู่แล้ว แต่ฉันต้องการทำเช่นนี้ในบรรทัดสถานะของหน้าจอเมื่อฉันกระโดดออกจากโฮสต์เหล่านี้ไปยังเราเตอร์ / สวิตช์ซึ่งไม่อนุญาตให้ฉันทำสีที่ฉับพลัน ด้วยวิธีนี้ฉันสามารถมีหน้าต่างเดียวสำหรับการผลิตและอีกหนึ่งหน้าต่างสำหรับการพัฒนาด้วยสีของบรรทัดสถานะหน้าจอที่บอกฉันว่าฉันอยู่บนหน้าจอเพียงใด


ชื่อโฮสต์ของเครื่องที่หน้าจอกำลังทำงานอยู่ หรือชื่อโฮสต์ของ 'window' ของหน้าจอนั้นกำลังใช้งานอยู่?
Kyle Brandt

@Kyle: ชื่อโฮสต์ของเครื่องที่หน้าจอกำลังทำงานอยู่ ดูคำถามที่อัปเดตสำหรับรายละเอียดเพิ่มเติมอีกเล็กน้อย
Murali Suriar

คำตอบ:


13

ฉันเห็นสองวิธีในการทำสิ่งนี้สิ่งแรกคือการสร้างไฟล์. screenrc โดยโฮสต์
ชอบ.screenrc_serverA, .screenrc_serverB...
ในสคริปต์เริ่มต้นเปลือกของคุณตั้ง SCREENRC เพื่อสิ่งที่ต้องการ.screenrc_`hostname`
แน่นอนคุณสามารถใช้คำสั่งที่มาของหน้าจอที่จะรวมถึงสิ่งที่ต้องการ.screenrc_defaultในแต่ละ .screenrc_ กำหนดเอง ... ไฟล์เพื่อให้พวกเขามีเพียงคำอธิบาย / สาย hardstatus และไม่ การกำหนดค่าทั้งหมดในแต่ละครั้ง

วิธีที่สองคือการเรียกใช้คำสั่งเช่นscreen -X hardstatus lastline ...(ใช้ถ้าการทดสอบเพื่อรันคำสั่งด้วยค่าที่แตกต่างกันสำหรับ ... ขึ้นอยู่กับชื่อโฮสต์) ในสคริปต์เริ่มต้นเชลล์ของคุณ เมื่อคุณจะล็อกออนเซิร์ฟเวอร์หน้าจอ -X จะไม่ทำอะไรเลยเพราะหน้าจอจะยังไม่เปิดใช้ แต่ทุกครั้งที่คุณเปิดหน้าต่างใหม่ในหน้าจอฮาร์ดสตาทจะถูกอัปเดต

แน่นอนทางออกที่ 1 นั้นดีกว่าเพราะอันที่สองจะรีเฟรชบรรทัด hardstatus ทุกครั้งที่คุณเปิดหน้าต่างข่าวซึ่งอาจไร้ประโยชน์เพราะชื่อโฮสต์จะไม่เปลี่ยนแปลง


เมื่อคุณอ่าน ".screenrc_hostname" อ่าน ".screenrc_ hostname" ผมมีปัญหาที่จะรวม `ในการโพสต์
รัศมี

ดี - ฉันพลาดส่วนหนึ่งในหน้าคนเกี่ยวกับตัวแปรสภาพแวดล้อม SCREENRC ที่ถูกค้นหาก่อน
Murali Suriar

@radius ฉันสามารถเพิ่ม backticks โดยใช้คำแนะนำนี้: meta.stackexchange.com/a/70679/167351
Bruno 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( bแทนที่จะเป็นf ) และอย่างที่สองก็คือการใช้9เป็นค่าเริ่มต้นไม่ได้ผลสำหรับฉันอาจเป็นเพราะ tput-version ไม่ได้เป็นมาตรฐาน ในกรณีของเขาหรือของฉันฉันไม่รู้และมันก็ไม่ได้สำคัญอะไรมากนัก)
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%?"

จะให้บรรทัดสถานะที่ด้านล่างที่ดูเหมือน

ตัวอย่างหน้าจอ hardstatus

ชื่อโฮสต์เป็นสีแดงบนสีดำเวลาเป็นสีเขียวบนสีดำวันที่เป็นสีเหลืองบนสีดำ window ที่มีเครื่องหมาย * เป็นหน้าต่างปัจจุบันซึ่งแสดงเป็นข้อความสีน้ำเงินบนพื้นหลังสีขาว window ที่มีเครื่องหมาย - เป็นหน้าต่างที่ใช้งานก่อนหน้านี้แสดงข้อความสีขาวเป็นสีดำ หน้าต่าง 1 ด้านบนไม่เป็นปัจจุบันหรือก่อนหน้าและจะแสดงเป็นสีขาวบนสีดำ ความเป็นไปได้อื่น ๆ จะแสดงให้คุณเห็นผู้ใช้คนอื่น ๆ ที่แนบมากับ windows มีสีขาวดำและทำเครื่องหมายด้วย +

การมีการแสดงเวลายังช่วยรักษา alives หากคุณ ssh ไปยังเซิร์ฟเวอร์ระยะไกลเพื่อเรียกใช้หน้าจอเนื่องจากเวลาที่เปลี่ยนไปทุกนาทีจะทำให้เซสชันของคุณยังคงมีชีวิตอยู่แม้ว่าเชลล์จะไม่ได้ใช้งานทางด้านระยะไกล


ไม่อนุญาตให้ฉันจัดรูปแบบชื่อโฮสต์ตามโครงสร้าง (เช่นชื่อโฮสต์ใด ๆ ที่ลงท้ายด้วย '-dev' เป็นสีน้ำเงินชื่อโฮสต์ใด ๆ ที่ลงท้ายด้วย '-prod' เป็นสีแดง)
Murali Suriar

อา ถ้า screenrc เท่านั้น if-statements ได้รับการสนับสนุน regex
ทิมเคนเนดี้

4

คุณสามารถระบายสีบรรทัดสถานะจากภายในสคริปต์ backtick โดยการพิมพ์\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 วินาที) บิตรอบการโทรไปยัง backtick นั้นเพียงแค่ใส่วันที่ที่จุดเริ่มต้นของบรรทัดและเวลาหลังจากชื่อโฮสต์

คุณสามารถใช้กลไกนี้เพื่อระบายสีเอาท์พุทของสคริปต์โดยขึ้นอยู่กับค่าระดับประจุแบตเตอรี่โหลดของระบบหรืออุณหภูมิโดยสมมติว่าคุณสามารถเข้าถึงค่าที่เกี่ยวข้องจากเชลล์สคริปต์


+1 สำหรับการกล่าวขวัญscreenหลบหนี\005- วิธีการที่รูปแบบตามเงื่อนไขทั้งสามารถใส่ลงไปในเปลือกสคริปต์ที่สามารถอ่านได้มากขึ้นแทนของผู้ที่ยากต่อการแยกอยู่แล้วcaptionรับผิดชอบ hardstatusคำสั่งหน้าจอ
ckujau

1

หากคุณต้องการหลีกเลี่ยงสคริปต์จำนวนมากคุณสามารถลอง:

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

grep จะพิมพ์ชื่อโฮสต์เฉพาะเมื่อตรงกับ "prod" ดังนั้นคุณสามารถเสียบที่ backtick และ%?โครงสร้าง Viola!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.