我试图理解这个 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
不包含模式的行将不会被改变。