为什么'pkill /?' 杀死我的 SSH 会话?

sco*_*ooz 5 linux ssh bash root

通过 SSH 以 root 身份运行以下命令 (bash) 后:

    pkill --help
    pkill -h
    pkill /?
Run Code Online (Sandbox Code Playgroud)

前两个命令没有为我提供任何信息,这就是为什么运行第三个命令(有点本能......)。

接下来发生的事情是,我与服务器的 SSH 会话关闭,并且无法重新连接。我猜它停止了所有(或大部分)正在运行的进程,包括负责此类会话的守护进程。

我想了解为什么会发生这种情况:我的输入的确切评估(逐步)是什么以及它是什么原因造成的。

我最好的猜测是它与 shell 对 '?' 的评估有关。字符,它可能转换为一些单字符表达式的列表,这些表达式被传递给 pkill,而 pkill 又关闭了这些 PID。

bec*_*est 20

在 CentOS 5.2 上,运行提供的手册页man pkill说它会解释 /? 作为进程名称或命令行的扩展正则表达式。

所以 ?表示前一个角色可能出现也可能不出现。由于只有一个其他字符,即 /,因此 pkill 可以杀死所有可能的进程。

在 linux 系统上,尽量记住 man 命令以首先获取文档。

  • @ablackhat 实际上,它会匹配所有内容,因为进程名称中的“/”是可选的。您可以使用任何其他字符后跟“?” 并得到相同的结果:您的匹配逻辑基本上是“进程名称有字符 A 或没有 A”,这总是正确的。运行`pgrep -l /?` 也可以查看名称;您会发现这些名称中没有“/”。`pgrep` 与你的 `ps auxw | 不匹配 egrep /` 会,因为 `ps auxw` 会显示可执行路径,其中包含“/”。 (11认同)
  • @scooz,不,大多数进程名称根本不包含“/”。如上所述,运行`pgrep -l /?` 来查看。或者,就此而言,`pgrep -la?`。您会看到它将匹配 sshd,它显然没有“a”,更不用说“/”了。更多的是正则表达式的逻辑:名称需要“具有该字符或不具有该字符”,即条件将始终返回true。实际上,更多关于正则表达式文档的编写方式:名称中将包含 0 或 1 个“/”字符,如“?”所指定。修饰符。 (2认同)

eww*_*ite 7

pgrep /?...

这将返回与该 shell 模式匹配的进程的 PID。pkill使用相同的参数运行将杀死pgrep /?输出中列出的所有内容。

我认为您正在杀死自己的会话以及许多其他进程(在本例中为所有 PID)。