我正在开发一个Linux应用程序服务器,该服务器需要能够终止来自一个或多个特定IP地址的所有入站SSH连接。
我可以使用ss
通过列出入站SSH连接
sudo ss -p | grep -i -c -E 'ssh.*${host}'
它产生的输出看起来像
tcp ESTAB 0 60 xxx.xxx.xxx.111:ssh my.server.ip:64938 users:(("sshd",pid=2089
,fd=3),("sshd",pid=2038,fd=3))
这表明.111客户端有两个打开的SSH套接字,它们分别具有PID 2089和2038。但格式似乎只是带有一些括号的文本。
我如何将这些PID传递或管道传输到kill
中,以便结束那些特定的sshd进程,但保持其他sshd进程打开?
应用程序服务器正在节点上运行。
您可以在system()
函数中使用awk
及其内部版本:
ss -p | grep :ssh | awk -F, '{print $2 }' | awk -F= '{system("kill -9 " $2) }'
此解决方案基于@marekful的答案。
他的解决方案只获取每个ss
输出的第一个pid,但每个连接都可以有一个或多个关联的pid。为了获得所有这些,我使用了以下代码:
sudo ss -p
| grep -i -E 'ssh.*.111'
| gawk '{
while (match($0, /pid=([0-9]+)/, ary)) {
print 'killing', ary[1];
system("sudo kill -9 " ary[1]);
$0 = substr($0, RSTART + RLENGTH);
}
}'