![通过 SSH 连接到远程服务器并找到特定的 pid 并将其杀死](https://linux22.com/image/142610/%E9%80%9A%E8%BF%87%20SSH%20%E8%BF%9E%E6%8E%A5%E5%88%B0%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%B9%B6%E6%89%BE%E5%88%B0%E7%89%B9%E5%AE%9A%E7%9A%84%20pid%20%E5%B9%B6%E5%B0%86%E5%85%B6%E6%9D%80%E6%AD%BB.png)
我想远程登录服务器,然后找到特定端口的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 kill
:kill
使用标准输入作为参数进行调用
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
你已经足够接近你的目标了。但还是有一些缺失的地方。
- 主机 IP 后不需要分号,远程命令应紧接在 IP 后面。因此,删除分号。
- 将 awk 前面的另一个分号替换为管道符号
|
- 这样 netstat 输出将转到 awk。 - 所有美元符号都需要用反斜杠转义。否则将在本地计算机上进行评估
完成以上几点后,您将获得打印的 PID(如果有的话)。然后你需要将该 PID 传递给终止命令。我建议您使用 xargs Kill,因为它在这里看起来最简单。这样 PID 将被kill 命令接受。
所以最终版本可能如下所示:
ssh -T [email protected] "netstat -lnpt | awk '\$4 ~ /:2020$/ {sub(/\/.*/, "", \$7); print \$7}') | xargs kill"
不是最好的外观,但我适合你的方法。