web-dev-qa-db-ja.com

ログイン前にカラーコードのエスケープシーケンスを送信することはできますか?

コンソールに色を付けようとしていますが、rootの.bash_profileで次のように成功しています。

echo -en "\e]P7000000"
echo -en "\e]P0F0F0F0"
clear

問題は、これは明らかにrootユーザーが最初にログインしたときにのみ開始されることです。mingettyを取得して適切なコンソールの色を自動的に設定する方法はありますか?提案されたソリューションは、RHEL6およびRHEL7(つまり、systemd)で機能するはずです。これは、私のシステムの大部分がそれであるためです。これは通常のコンソールの色付けに関するものであり、ターミナルエミュレーターやSSHではないことに注意してください(前者は関係ありません。後者はユーザー構成の問題と見なされます)。

2
Bratchley

コメントで提案されているように、literalエスケープ文字を/etc/issueに入れることができます(Red Hatがこれを行う場合があります)。簡単なテストでは、これは機能しますが、textにのみ色を付けます。背景は無着色です。 viでは、テキストは次のようになります。

^[]P7000000^[]P0F0F0F0\S
Kernel \r on an \m

そしてこのような結果:

screenshot of CentOS 7 console window

画面をクリアすると、色がウィンドウ全体に表示されます。例:

^[]P7000000^[]P0F0F0F0^[[2J\S
Kernel \r on an \m

ここで、^[はASCII escape 文字、を使用してviに挿入 controlV エスケープ文字が続きます。

/etc/issueを変更することは、間違いを犯したときにマシンにsshして修復できる限り、比較的安全です。 mingettyは、ログイン前にそのファイルを出力します。 sshはそこに行きません。

ただし、同じ方法で/etc/motdも変更したくなるかもしれません(結局のところ、thatも出力されます)。しかし、それは問題を引き起こします。スクリプトで、\eliteralASCIIエスケープ文字に置き換えたら

echo -en "\e]P7000000"
echo -en "\e]P0F0F0F0"

あなたが得るだろう

escape]P7000000
escape]P0F0F0F0

エスケープシーケンスの標準(ECMA-48)には、 escape]オペレーティングシステムコマンドで始まり、文字列ターミネータで終わります。 Linuxコンソールの実装には何もありません。 xtermを使用して不適切に終了したエスケープシーケンスで/etc/motdを出力しようとすると、sshに接続することで興味深い(不可解な)端末ロックアップを取得できます。 brokenLinuxOSCリソースには(少なくともxtermの)回避策があります。

参考文献:

3
Thomas Dickey