ホスト名に基づいてGNU画面のステータス行を変更するにはどうすればよいですか?


31

ログインするすべてのUNIXサーバーにNFS経由で自動マウントされる共有ホームディレクトリがあります。(たとえば)hardstatus行にホスト名を別の色で表示して、実稼働環境と開発環境のどちらにログオンしたかを示す単一の.screenrcが必要です。ホスト名は、パターンマッチングを使用して簡単に実行できるようなものです。

条件文を.screenrcに入れる方法はありますか?manページの簡単なgrepでは、明らかなことは何も明らかにされていません。

編集:

明確にするために、カスタムのハードステータス行が既にあります。画面が呼び出されるホスト名に基づいて表示される色/フィールドの一部を変更したい。私はすでにPS1でこのようなものを持っていますが、これらのホストからルーター/スイッチにジャンプするときに画面のステータス行でこれを行いたいので、プロンプトの色付けはできません。これにより、生産用と開発用のウィンドウを1つ持つことができます。画面のステータス行の色によって、どのウィンドウが一目でいるかがわかります。


画面が実行されているマシンのホスト名?または、特定の画面「ウィンドウ」のホスト名が使用していますか?
カイルブラント

@Kyle:画面が実行されているマシンのホスト名。詳細については、更新された質問をご覧ください。
ムラリSuriar

回答:


13

これを行うには2つの方法があります。最初の方法は、ホストごとに.screenrcファイルを作成することです。
同様に.screenrc_serverA.screenrc_serverB、...
のような何かにあなたのシェルの起動スクリプトのセットSCREENRCでは.screenrc_`hostname`
もちろん、あなたのような何か含まれるように、画面のソースコマンドを使用することができ.screenrc_default、彼らは唯一のキャプション/ハードステータス行はなく含まれているので、ファイル...各カスタム.screenrc_中を設定ごとに。

2番目の方法はscreen -X hardstatus lastline ...、シェル起動スクリプトで(ホスト名に応じて...に異なる値でコマンドを実行するifテストを使用して)などのコマンドを実行することです。サーバーにログオンすると、screenはまだ起動されていないためscreen -Xは何もしませんが、screenで新しいウィンドウを開くたびにhardstatusが更新されます。

もちろん、ホスト名が変更されないため、おそらく役に立たないニュースウィンドウを開くたびに2番目のソリューションがhardstatus行を更新するため、1番目のソリューションの方が優れています。


「.screenrc_hostname」を読んだ場合、hostname「。screenrc_」を読んでください。ポストに `を含める問題が発生しました
半径

ニース-最初に検索されるSCREENRC環境変数に関するマニュアルページの一部を見逃しました。
ムラリスリアー2009年

@radiusこの提案を使用してバックティックを追加できました:meta.stackexchange.com/a/70679/167351
ブルーノブロノスキー

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
2つの「矛盾」が見つかりました。1つ目は、バックグラウンドにsetafも使用されるという事実ですが、setabfの代わりにb)である必要があり、2つ目は、デフォルトとしてtput-versionが標準ではない可能性があるためです彼の場合または私の場合、私は単に知らないし、それは本当に重要ではない)9
シャドウ

@Shadowはそれを見つけてくれてありがとう。修正しました。
ブルーノブロノスキー

5

.screenrcにhardstatus変数として設定するだけです。ホスト名に%Hのような変数を使用している限り、その変数は、作業中のホスト名に一致するように変更されます。

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

下部に次のようなステータス行が表示されます

画面のハードステータスの例

ホスト名は黒で赤、時間は黒で緑、日付は黒で黄色です。*が付いたウィンドウは現在のウィンドウで、白い背景に青色のテキストで表示されます。-でマークされたウィンドウは以前にアクティブだったウィンドウで、黒に白のテキストが表示されます。上記のウィンドウ1は、現在でも前でもないため、黒の上に白で表示されます。他の可能性としては、ウィンドウに接続されている他のユーザーが黒で白く表示され、+でマークされます。

時間表示があることは、リモートサーバーにSSH接続して画面を実行する場合にも、キープアライブに役立ちます。シェルがリモート側でアイドル状態であっても、毎分時間が変わるとセッションが生き続けるからです。


それは私が条件付きで、その構造に基づいて、ホスト名をフォーマットすることはできません(例えば「-dev」青で終わるすべてのホスト名は、任意のホスト名が赤で「-prod」で終わる。)
ムラリSuriar

ああ。screenrcのif文のみが正規表現をサポートしている場合。
ティムケネディ

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.