当使用grep
或egrep
搜索带有--help
参数的程序的输出时,它会打印完整的输出而不是匹配的行。
例子:
ssh-keygen --help | grep "known_hosts"
unknown option -- -
usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1]
[-N new_passphrase] [-C comment] [-f output_keyfile]
ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
ssh-keygen -i [-m key_format] [-f input_keyfile]
ssh-keygen -e [-m key_format] [-f input_keyfile]
ssh-keygen -y [-f input_keyfile]
// etc
当搜索参数时,例如ssh-keygen --help | grep "-p"
grep 会自行识别此参数。转义破折号(即grep "\-p"
)没有帮助。
例子:
ssh-keygen --help | grep "-p"
grep: invalid option -- 'p'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
unknown option -- -
usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1]
[-N new_passphrase] [-C comment] [-f output_keyfile]
ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
ssh-keygen -i [-m key_format] [-f input_keyfile]
ssh-keygen -e [-m key_format] [-f input_keyfile]
ssh-keygen -y [-f input_keyfile]
ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]
ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]
ssh-keygen -B [-f input_keyfile]
如何解决这个问题?谢谢您的帮助!
答案1
该ssh-keygen
命令没有--help
选项,因此它会打印“未知选项”错误,默默地想“RTFM”并输出帮助。它不是在 stdout 上执行此操作,而是在标准错误,它不是通过 管道传输的|
,而只是通过 管道传输的|&
(这是 的bash
简写2>&1 |
):
$ ssh-keygen --help |& grep "known_hosts"
ssh-keygen -F hostname [-f known_hosts_file] [-l]
ssh-keygen -H [-f known_hosts_file]
ssh-keygen -R hostname [-f known_hosts_file]
一个完全不同的问题是,grep
由于搜索表达式以连字符开头,因此将其识别为选项。幸运的是,grep
有众多命令可以识别“选项结尾”--
选项,并将其后面的所有内容作为参数而不是选项:
$ ssh-keygen --help |& grep -- -p
ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
man grep
甚至没有提到它,但是这里是bash
手册中对此选项的描述:
A
--
表示选项结束并禁用进一步的选项处理。 之后的任何参数--
都被视为文件名和参数。
grep
还提供了第二种方法来处理以“-”开头的模式:该-e
选项以模式作为其参数,因此以下情况同样可能:
$ ssh-keygen --help |& grep -e -p
ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
进一步阅读
答案2
您ssh-keygen
使用不存在的选项进行调用。这是一个错误,错误输出会出现在 stderr 上。它似乎没有ssh-keygen
常规选项来输出其用法:如果它有(就像 GNU 程序默认使用 一样--help
),那么“常规”输出将出现在 stdout 上,并且可以在您使用的管道中被 less 访问。
您可以使用以下方法解决这个问题ssh-keygen --help 2>&1 | grep -e "-p"
:2>&1
将 stderr 重定向到 stdout,管道可以在其中捕获它,并且-e
作为 grep 的选项意味着“以下是即使看起来像一个选项,也要使用的正则表达式”。
man ssh-keygen
应该更好地获取用法,并且less
默认进入管道,您可以使用搜索正则表达式/
,并且在上下文中阅读通常是更好的选择。
答案3
如果你正在寻找有关 ssh-keygen 命令的帮助,请尝试
man ssh-keygen | grep known_hosts
或者,您可以man ssh-keygen
从命令行执行,然后按下/并键入搜索词,例如“kno”,按下Enter,使用n继续到搜索词的下一个实例(man man
有关使用的更多信息man
)。请注意,man
搜索仅向下搜索,因此在开始新搜索之前,使用PgUp或Home返回到手动输入的开头。