壳牌管道

Spa*_*rta 2 command-line bash

我试图理解这个 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用的?
  • 最后一行我没听懂。

raj*_*raj 5

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

\n

man ssh-keygen

\n
 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.\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

seds/pattern/replacement/在每一行输入上运行该命令,即将该行替换patternreplacement并将其复制到标准输出。如果pattern在该行中找不到 ,则该行将被原封不动地复制。

\n

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

\n

它可以细分如下:

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

    \n
  • \n
  • 第一组是SHA256:\\S\\+. 这意味着一个文字字符串SHA256:,后跟一个或多个非空格字符 ( \\S\\+) - 但是,应该注意的是,并非所有sed实现都支持\\S作为非空格字符的指示。因此,第一组匹配SHA256:后跟任何字符,直到第一个空格。

    \n
  • \n
  • 第二组是[^)]\\+,即一个或多个不等于右括号的字符。考虑到整个组都放在括号中,第二组匹配放在括号中的任何字符串,直到右括号。

    \n
  • \n
\n

总而言之,sed在线搜索由SHA256:加上任何非空格字符,然后放置在括号中的任何字符串以及它们之间的任何内容组成的模式。

\n

匹配的模式将替换为与\\2: \\1第二组 ( ) 匹配的文本\\2、冒号、空格以及与第一组 ( \\1) 匹配的文本。

\n

例如,如果ssh-keygen输出包含类似以下的行

\n
begin something SHA256:123456 middle something (text inside parens) end something\n
Run Code Online (Sandbox Code Playgroud)\n

sed将该行替换为

\n
text inside parens: SHA256:123456 end something\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n