通过 SSH 连接到远程服务器并找到特定的 pid 并将其杀死

通过 SSH 连接到远程服务器并找到特定的 pid 并将其杀死

我想远程登录服务器,然后找到特定端口的pid。之后杀死那个pid。

我试过这个,

ssh -T [email protected] ; "netstat -lnpt ; awk '$4 ~ /:2020$/ {sub(/\/.*/, "", $7); print $7}'" 

我应该只使用netstat命令来执行此操作

答案1

你错过了管道特征(|而不是;) 在你的命令中。我建议这个:

ssh -t [email protected]  "sudo netstat -plnt | grep 2020 | awk '{print \$7}' | sed s+/.*++g | sort -u | xargs kill"

我假设您已sudo在服务器上安装并有权使用它。我的测试表明您可能需要它才能netstat正常使用-p选项。

我更喜欢在这里使用grep+来sed避免 awk 脚本过于复杂(在我看来)。

  • -t:允许您输入用户密码来执行sudo命令
  • grep 2020:过滤端口号
  • awk '{print \$7}':让我们awk选择正确的字段
  • sed s+/.*++g:删除/及其后面的字符(注意:为简短起见,该+符号替换了此处的传统符号/
  • sort -u:以防万一您有多个进程正在使用该端口(如果同时使用 IPv4 和 IPv6,则会发生这种情况)
  • xargs killkill使用标准输入作为参数进行调用

sudo如果要终止的进程由另一用户拥有,您可能需要添加到最后一个:sudo xargs kill

例如,您还可以使用变量(请注意此处用于分隔命令的分号,无需管道):

[email protected] ; port=2020 ; ssh -t $server "sudo netstat -plnt | grep $port | awk '{print \$7}' | sed s+/.*++g | sort -u | xargs kill"

答案2

你已经足够接近你的目标了。但还是有一些缺失的地方。

  1. 主机 IP 后不需要分号,远程命令应紧接在 IP 后面。因此,删除分号。
  2. 将 awk 前面的另一个分号替换为管道符号|- 这样 netstat 输出将转到 awk。
  3. 所有美元符号都需要用反斜杠转义。否则将在本地计算机上进行评估

完成以上几点后,您将获得打印的 PID(如果有的话)。然后你需要将该 PID 传递给终止命令。我建议您使用 xargs Kill,因为它在这里看起来最简单。这样 PID 将被kill 命令接受。

所以最终版本可能如下所示:

ssh -T [email protected] "netstat -lnpt | awk '\$4 ~ /:2020$/ {sub(/\/.*/, "", \$7); print \$7}') | xargs kill"

不是最好的外观,但我适合你的方法。

相关内容