彩色 ssh 横幅

彩色 ssh 横幅

我想给我的 ssh 横幅上色。我知道我可以像这样执行:

/etc/profile可以输入:

echo -e "\e[1;31m Colorful text"
echo -e "\e[0m Reset"

但我在横幅中有一些带有特殊字符的 ASCII 艺术。有什么方法可以在不转义 ASCII 艺术中的每个特殊字符的情况下对其进行着色吗?

答案1

您可能想看看toilet。我实验室的一台服务器的横幅中包含以下内容:

在此输入图像描述

您可以将其安装在基于 Debian 的系统上:

sudo apt-get install toilet

TOIlet 使用由较小字符组成的大字符打印文本。它在很多方面与 Figlet 相似,但具有 Unicode 处理、彩色字体、过滤器和各种导出格式等附加功能。

toilet与 ASCII 艺术完美配合:

在此输入图像描述


我编写了一个小 Perl 脚本来突出显示文本中的特定正则表达式。如果您使用.正则表达式,它将为所有内容着色为特定颜色:

在此输入图像描述

该脚本(用于-h一个小的帮助消息):

#!/usr/bin/env perl
use Getopt::Std;
use strict;
use Term::ANSIColor; 

my %opts;
getopts('hic:l:',\%opts);
    if ($opts{h}){
    print "Use -l to specify the letter(s) to highlight. To specify more than one patern use commas.\n -i makes the search case sensitive\n -c: comma separated list of colors\n";
    exit;
    }
my $case_sensitive=$opts{i}||undef;
my @color=("bold blue",'bold red', 'bold yellow', 'bold green', 'bold magenta', 'bold cyan', 'yellow on_magenta', 'bright_white on_red', 'bright_yellow on_red', 'white on_black');
if ($opts{c}) {
   @color=split(/,/,$opts{c});
}
my @patterns;
if($opts{l}){
     @patterns=split(/,/,$opts{l});
}
else{
    $patterns[0]='\*';
}
# Setting $| to non-zero forces a flush right away and after 
# every write or print on the currently selected output channel. 
$|=1;

while (my $line=<>) 
{ 
    for (my $c=0; $c<=$#patterns; $c++){
      if($case_sensitive){
        if($line=~/$patterns[$c]/){
        $line=~s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ge; 
        }
      }
      else{
        if($line=~/$patterns[$c]/i){
          $line=~s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ige; 
        }
      }
    }
    print STDOUT $line;
}

答案2

根据我在 U&L 的其他问答中的研究,标题为:sshd 横幅中的非 ASCII 可打印字符不可能让 SSH 的横幅工具打印对输出进行着色所需的转义序列。这实际上是出于安全原因而设计的。

因此不可能以这种方式打印 SSH 横幅。

相关内容