我有一个 SFTP 服务器,客户端每分钟都会连接一次以交换文件。一些客户端连接后不断开连接,导致一段时间内出现大量连接。这会堵塞 CPU。我在 sshd_config 中设置了 ClientAliveInterval 和 ClientAliveCountMax,这会在一段时间后断开空闲的 ssh 连接,但 id 似乎不会断开空闲的 sftp 连接。如何强制断开空闲的 sftp 连接?
答案1
一步一步尝试:
pstree -p
—— 将显示整个流程树。
w
- 谁在做什么。 - 这可能不是必要的(或者也许您可以获得用户的空闲时间。)
ps aux| grep sshd
尝试获取 sshd 会话的进程 ID,它是 sftp 服务器的父进程。您可以从中获取用户的 sftp 进程 ID ps aux | grep sshd
,然后终止其父进程:
附言输出将会像这样:
root@server:/# ps aux | grep ssh
root 3531 0.0 0.0 5312 1012 ? Ss Jan02 0:00 /usr/sbin/sshd
root 24034 0.0 0.1 8052 2412 ? Ss 13:24 0:00 sshd: metin [priv]
metin 24039 0.0 0.0 8052 1500 ? S 13:24 0:00 sshd: metin@notty
metin 24042 0.0 0.0 4568 1240 ? Ss 13:24 0:00 /usr/lib/openssh/sftp-server
root 24043 0.0 0.1 8052 2632 ? Ss 13:24 0:00 sshd: metin [priv]
metin 24048 0.0 0.0 8052 1532 ? S 13:24 0:00 sshd: metin@pts/0
root 24109 0.0 0.0 3000 748 pts/0 R+ 13:26 0:00 grep ssh
pstree-p输出将会像这样:
init(1)─┬─apache2(4012)─┬─apache2(23627)
│ ├─apache2(23846)
│ ├─apache2(23913)
│ ├─apache2(23998)
│ ├─apache2(24000)
│ ├─apache2(24025)
│ ├─apache2(24028)
│ ├─apache2(24073)
│ ├─apache2(24074)
│ └─apache2(24075)
├─console-kit-dae(25820)
├─courierlogger(3719)───authdaemond(3720)─┬─authdaemond(3734)
│ ├─authdaemond(3736)
│ ├─authdaemond(3738)
│ ├─authdaemond(3740)
│ └─authdaemond(3741)
├─courierlogger(3744)───couriertcpd(3745)
├─courierlogger(3768)───couriertcpd(3769)
├─courierlogger(3786)───couriertcpd(3787)
├─courierlogger(3810)───couriertcpd(3811)
├─cron(3991)
├─dbus-daemon(3475)
├─dd(3451)
├─getty(4038)
├─klogd(3454)
├─master(3882)─┬─pickup(23992)
│ ├─qmgr(3885)
│ └─tlsmgr(4144)
├─mysqld_safe(3591)─┬─logger(3635)
│ └─mysqld(3633)─┬─{mysqld}(3637)
│ ├─{mysqld}(3638)
│ ├─{mysqld}(3639)
│ ├─{mysqld}(3640)
│ ├─{mysqld}(3642)
│ ├─{mysqld}(3643)
│ ├─{mysqld}(3644)
│ ├─{mysqld}(3655)
│ ├─{mysqld}(861)
│ ├─{mysqld}(17322)
│ ├─{mysqld}(18125)
│ ├─{mysqld}(18872)
│ ├─{mysqld}(21229)
│ ├─{mysqld}(23352)
│ ├─{mysqld}(23353)
│ └─{mysqld}(23370)
├─named(3502)─┬─{named}(3504)
│ ├─{named}(3505)
│ └─{named}(3506)
├─ntpd(3106)
├─saslauthd(3912)─┬─saslauthd(3913)
│ ├─saslauthd(3914)
│ ├─saslauthd(3915)
│ └─saslauthd(3916)
├─sshd(3531)─┬─sshd(24034)───sshd(24039)───sftp-server(24042)
│ ├─sshd(24043)───sshd(24048)───bash(24050)───su(24077)───bash(24078)───ps+
│ └─sshd(24094)───sshd(24099)───sftp-server(24101)
├─syslogd(3429)
├─udevd(2216)
└─vsftpd(3932)
您将要执行此操作kill 24034
,因为它是进程用户“metin”的父 sshd 会话,一直用作进程 24042(请查看ps
上面的输出)。
并且您还可以从输出中获取它们的状态(空闲,睡眠,活动等)ps
。
如果您想自动执行此操作,我不知道有任何软件可以做到这一点,但您可以编写自己的脚本。