我想给我的 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 横幅。