Pat*_*ryk 7 colors bash ssh profile
我想为我的 ssh 横幅着色。我知道我可以像这样执行它:
在/etc/profile
我可以放:
echo -e "\e[1;31m Colorful text"
echo -e "\e[0m Reset"
Run Code Online (Sandbox Code Playgroud)
但是我在横幅中有一些带有特殊字符的 ASCII 艺术。有没有办法在不转义 ASCII 艺术中的每个特殊字符的情况下对其进行着色?
ter*_*don 10
你可能想看看toilet
。我实验室的其中一台服务器的横幅中包含以下内容:
您可以使用以下命令将其安装在基于 Debian 的系统上
sudo apt-get install toilet
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
根据我在其他 U&L 问答中的研究,标题为:sshd 横幅中的非 ASCII 可打印字符,不可能让 SSH 的横幅工具打印输出着色所需的转义序列。这实际上是出于安全原因设计的。
因此,以这种方式打印 SSH 横幅是不可能的。