Bagaimana Anda bisa mengubah garis status layar GNU berdasarkan nama host?

31

Saya memiliki direktori home bersama yang diautomatiskan melalui NFS di semua server UNIX tempat saya masuk. Saya ingin memiliki satu .screenrc yang (misalnya) menempatkan nama host di baris hardstatus dalam warna yang berbeda untuk menunjukkan ketika saya masuk ke produksi versus pengembangan; nama host kami sedemikian rupa sehingga ini dapat dengan mudah dilakukan melalui penggunaan pencocokan pola.

Apakah ada cara untuk memasukkan pernyataan bersyarat ke .screenrc? Memandang cepat halaman manual tampaknya tidak mengungkapkan sesuatu yang jelas.

EDIT:

Untuk memperjelas, saya sudah memiliki garis status keras khusus; Saya ingin mengubah beberapa pewarnaan / bidang yang ditampilkan berdasarkan nama host tempat layar dipanggil. Saya sudah memiliki sesuatu seperti ini untuk PS1 saya, namun saya lebih suka melakukan ini di baris status layar karena saya melompat dari host ini ke router / switch, yang tidak memungkinkan saya untuk melakukan colourisation yang cepat. Dengan cara ini, saya dapat memiliki satu jendela untuk produksi, dan satu untuk pengembangan, dengan warna garis status layar memberi tahu saya yang mana saya berada sekilas.

Murali Suriar
sumber
Nama host mesin yang menjalankan layar? Atau nama host dari 'jendela' layar tertentu yang digunakan?
Kyle Brandt
@Kyle: nama host dari mesin yang menjalankan layar. Lihat pertanyaan yang diperbarui untuk sedikit lebih detail.
Murali Suriar

Jawaban:

13

Saya melihat dua cara untuk melakukan ini, yang pertama adalah membuat file .screenrc oleh tuan rumah.
Seperti .screenrc_serverA,, .screenrc_serverB...
Dalam skrip startup shell Anda, atur SCREENRC ke sesuatu seperti .screenrc_`hostname`
Tentu saja Anda dapat menggunakan perintah sumber layar untuk memasukkan sesuatu seperti .screenrc_defaultdi setiap file .screenrc_… kustom sehingga file tersebut hanya berisi baris keterangan / hardstatus dan bukan seluruh konfigurasi setiap kali.

Cara kedua adalah dengan mengeksekusi perintah seperti screen -X hardstatus lastline ...(menggunakan jika tes untuk mengeksekusi perintah dengan nilai yang berbeda untuk ... tergantung dari nama host) di skrip startup shell Anda. Ketika Anda akan masuk ke server, layar -X tidak akan melakukan apa-apa karena layar belum akan diluncurkan, tetapi setiap kali Anda membuka jendela baru di layar, hardstatus akan diperbarui.

Tentu saja solusi pertama lebih baik karena yang kedua akan menyegarkan garis hardstatus setiap kali Anda membuka jendela berita yang mungkin tidak berguna karena nama host tidak akan berubah.

radius
sumber
Ketika Anda membaca ".screenrc_hostname" baca ".screenrc_ hostname". Saya punya masalah untuk memasukkan `dalam pos
radius
Bagus - Saya melewatkan bagian di halaman manual tentang variabel lingkungan SCREENRC yang dicari terlebih dahulu.
Murali Suriar
@radius Saya dapat menambahkan backticks menggunakan saran ini: meta.stackexchange.com/a/70679/167351
Bruno Bronosky
16

@radius tepat dengan hal SCREENRC, tapi itu bukan jawaban yang sangat lengkap, jadi saya akan menguraikan ...

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

* Selalu gunakan tes baru !

Sepatah kata tentang karakter pelarian

Cara yang tepat untuk memasukkan warna dalam skrip adalah dengan tput, bukan karakter melarikan diri. Karakter pelarian Anda khusus untuk terminal Anda. Perintah tput adalah terminal aware. Saya menulis ini ketika saya perlu menyukai skrip saya:

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

Saya juga membuat skrip untuk menunjukkan penggunaan tput. Anda bisa mendapatkannya dari intisari ini.

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

Bruno Bronosky
sumber
1
Saya menemukan dua "inkonsistensi". Yang pertama adalah fakta bahwa juga untuk latar belakang setafdigunakan, meskipun seharusnya setab( b bukan f ) dan yang kedua yang menggunakan 9sebagai default tidak berfungsi untuk saya, mungkin karena versi tput tidak standar (baik dalam kasingnya atau di kasinganku, aku benar-benar tidak tahu dan itu tidak terlalu berarti)
Shadow
@Shadow, terima kasih sudah menangkapnya. Saya memperbaikinya.
Bruno Bronosky
5

Cukup atur di .screenrc Anda sebagai variabel hardstatus. Selama Anda menggunakan variabel seperti% H untuk nama host, itu akan berubah agar cocok dengan nama host apa pun yang Anda kerjakan.

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

Akan memberi Anda garis status di bagian bawah yang terlihat seperti

contoh layar hardstatus

nama host merah pada hitam, waktu hijau pada hitam, tanggal kuning pada hitam. jendela yang ditandai dengan * adalah jendela saat ini, ditampilkan dalam teks biru dengan latar belakang putih. jendela yang ditandai dengan - adalah jendela yang sebelumnya aktif, ditampilkan teks putih di atas hitam. jendela 1, di atas, bukan arus, atau sebelumnya, dan akan ditampilkan dalam warna putih di atas hitam. kemungkinan lain akan menunjukkan kepada Anda pengguna lain yang terpasang pada windows, putih di atas hitam, dan ditandai oleh +.

memiliki tampilan waktu juga membantu menjaga hidup jika Anda ssh ke server jauh untuk menjalankan layar, karena waktu yang berubah setiap menit akan membuat sesi Anda tetap hidup, bahkan jika shell idle di sisi remote.

Tim Kennedy
sumber
Itu tidak memungkinkan saya untuk memformat nama host secara kondisional berdasarkan strukturnya (mis. Nama host apa pun yang berakhiran '-dev' berwarna biru, nama host apa pun yang berakhiran '-prod' dalam warna merah.)
Murali Suriar
ah. jika hanya screenrc jika-pernyataan yang didukung regex.
Tim Kennedy
4

Anda dapat mewarnai garis status dari dalam skrip backtick dengan mencetak \005{..r}atau serupa ( runtuk merah dll seperti di dalam .screenrcdirinya sendiri), sehingga Anda bisa meng-hash nama host untuk sampai pada angka, atau hanya memiliki banyak pernyataan kondisional untuk ditetapkan warna. Sebagai contoh, inilah skrip untuk mengubah warna dan mencetak nama host untuk digunakan di dalam layar:

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

Anda kemudian menambahkan entri untuk skrip ini ke .screenrcdan merujuknya dalam hardstatus atau keterangan sebagai% 4`:

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

Ini mengasumsikan nama host tidak mungkin berubah, karenanya batas waktu dan validitas 1 jam (3600 detik); bit yang mengelilingi panggilan ke backtick itu sendiri hanya menempatkan tanggal di awal baris dan waktu setelah nama host.

Anda bahkan dapat menggunakan mekanisme ini untuk mewarnai hasil skrip tergantung pada nilai level pengisian baterai, beban atau suhu sistem, dengan asumsi Anda memiliki akses ke nilai yang relevan dari skrip shell.

Dominic Watkins
sumber
+1 untuk menyebutkan screenpelarian \005- dengan cara itu seluruh pemformatan bersyarat dapat dimasukkan ke dalam skrip shell yang jauh lebih mudah dibaca daripada yang sudah sulit diurai caption. hardstatusarahan layar.
ckujau
1

Jika Anda ingin menghindari banyak skrip, Anda dapat mencoba ini:

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

grep hanya akan mencetak nama host jika cocok dengan "prod", jadi Anda dapat menghubungkannya ke backtick dan %?konstruk. Biola!

Neal Fultz
sumber