我试图理解这个 Shell 行:
grep ^x06 ssh_known_hosts |
ssh-keygen -l -f -|
\sed -e 's/^.*\(SHA256:\S\+\).*(\([^)]\+\))/\2: \1/' >fp
Run Code Online (Sandbox Code Playgroud)
grep我们基本上是在搜索数据ssh_unknown_hosts。有何^x06用途?ssh-keygen命令,我们生成一个 SSH 密钥-l。是做什么-f用的?grep正在文件中搜索ssh_known_hosts以x06(表示正则表达式^中行的开头 ) 开头的行(或多行)并将其输出。
从man ssh-keygen:
ssh-keygen -l [-f input_keyfile]\n\n[...]\n\n -l Show fingerprint of specified public key file. Private RSA1 keys\n are also supported. For RSA and DSA keys ssh-keygen tries to\n find the matching public key file and prints its fingerprint. If\n combined with -v, an ASCII art representation of the key is sup\xe2\x80\x90\n plied with the fingerprint.\nRun Code Online (Sandbox Code Playgroud)\n因此,ssh-keygen -l -f -从标准输入(即从已输出的行grep)读取密钥并输出其指纹(-用作文件名表示标准输入)。
该sed部分是最困难的。人们需要很好地理解正则表达式才能理解它的作用。
seds/pattern/replacement/在每一行输入上运行该命令,即将该行替换pattern为replacement并将其复制到标准输出。如果pattern在该行中找不到 ,则该行将被原封不动地复制。
正在pattern sed寻找的是:^.*\\(SHA256:\\S\\+\\).*(\\([^)]\\+\\))。这当然是一个正则表达式。
它可以细分如下:
\n行开头 ( ^),后跟零个或多个任意字符 ( .*),后跟第一组( 之间的部分\\( ... \\);我们稍后会详细介绍),后跟零个或多个任意字符 ( .*),后跟第二组,它用括号括起来(\\( ... \\))。
第一组是SHA256:\\S\\+. 这意味着一个文字字符串SHA256:,后跟一个或多个非空格字符 ( \\S\\+) - 但是,应该注意的是,并非所有sed实现都支持\\S作为非空格字符的指示。因此,第一组匹配SHA256:后跟任何字符,直到第一个空格。
第二组是[^)]\\+,即一个或多个不等于右括号的字符。考虑到整个组都放在括号中,第二组匹配放在括号中的任何字符串,直到右括号。
总而言之,sed在线搜索由SHA256:加上任何非空格字符,然后放置在括号中的任何字符串以及它们之间的任何内容组成的模式。
匹配的模式将替换为与\\2: \\1第二组 ( ) 匹配的文本\\2、冒号、空格以及与第一组 ( \\1) 匹配的文本。
例如,如果ssh-keygen输出包含类似以下的行
begin something SHA256:123456 middle something (text inside parens) end something\nRun Code Online (Sandbox Code Playgroud)\nsed将该行替换为
text inside parens: SHA256:123456 end something\nRun Code Online (Sandbox Code Playgroud)\n不包含该模式的行将不会被更改。
\n