壳牌管道

壳牌管道

我试图理解这个 Shell 行:

grep ^x06 ssh_known_hosts |
ssh-keygen -l -f -| 
\sed -e 's/^.*\(SHA256:\S\+\).*(\([^)]\+\))/\2: \1/' >fp
  • 所以grep我们基本上是在搜索数据ssh_unknown_hosts。它有什么^x06用呢?
  • 使用ssh-keygen命令,我们将使用 生成 SSH 密钥-l。 有什么-f用?
  • 最后一句我没听懂。

答案1

grep正在文件中搜索ssh_known_hosts以 ( 开头的行(x06表示^行的开头正则表达式) 并将其输出。

man ssh-keygen

 ssh-keygen -l [-f input_keyfile]

[...]

 -l      Show fingerprint of specified public key file.  Private RSA1 keys
         are also supported.  For RSA and DSA keys ssh-keygen tries to
         find the matching public key file and prints its fingerprint.  If
         combined with -v, an ASCII art representation of the key is sup‐
         plied with the fingerprint.

因此,ssh-keygen -l -f -从标准输入(即从已输出的行grep)读取密钥并输出其指纹(-用作文件名表示标准输入)。

sed部分是最困难的。需要很好地理解正则表达式才能理解它的作用。

sed对输入的每一行运行该命令s/pattern/replacement/,即用 替换pattern并将replacement该行复制到标准输出。如果pattern在该行中未找到 ,则该行将保持不变。

正在pattern sed寻找的是:^.*\(SHA256:\S\+\).*(\([^)]\+\))。当然,这是一个正则表达式。

其具体分解如下:

  • 行首 ( ^),后跟零个或多个任意字符 ( .*),后跟第一个团体( ; 之间的部分\( ... \)我们稍后会详细介绍),后跟零个或多个任意字符(.*),后跟第二个团体,它被文字括号括起来(\( ... \))

  • 第一组是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

sed将该行替换为

text inside parens: SHA256:123456 end something

不包含模式的行将不会被改变。

相关内容