如何检测 SSH 连接?

如何检测 SSH 连接?

由于某种原因,我有以下场景:

在启动时,我会启动一个脚本,它会等待一段给定的时间,并检查在此时间窗口内是否建立了 SSH 连接。如果连接已打开,则脚本执行操作 A,否则它会终止 sshd 并执行 B。

检测开放连接的最佳方法是什么?(脚本可以用 Bash 或 Ruby 编写)

谢谢

答案1

如果您想检测当前的 SSH 会话,请使用lsof -i :22并查找返回超过 2 行或 grep 的 ESTABLISHED:
[root@nemo ~]# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 3772 root 3u IPv6 9906 TCP *:ssh (LISTEN)
sshd 21376 root 3r IPv6 159072 TCP myserver:ssh->someip:27813 (ESTABLISHED)
sshd 21381 james 3u IPv6 159072 TCP myserver:ssh->someip:27813 (ESTABLISHED)

要查看会话是否已打开,请在 /var/log/secure (在 redhat/centos/fedora 上)中查找类似以下内容:
Sep 27 05:05:28 nemo sshd[21376]: Accepted password for james from some_ip port 27813 ssh2
如果您允许通过密码以外的其他方式进行身份验证,则日志条目可能会略有不同。

答案2

#client connecting from ${CLIENT_IP} to local ssh listening on SSHD_IP default port

A() {
  echo "A"
}
B() {
  echo "B"
}
CLIENT_IP=""
SSHD_IP=""
sleeptime=5 #use this counter to sleep $sleeptime seconds, decrementing on match fail
while [ ${sleeptime} -gt 0 ] ; do
  netstat -nt |grep -q -E "${CLIENT_IP}:[0-9]+[[:space:]]+${SSHD_IP}:22[[:space:]]+ESTA"
  if [ $? -eq 0 ] ; then 
    A; exit 0
  else
    sleeptime=$((${sleeptime} - 1))
    sleep ${sleeptime}
  fi
done
kill -TERM `cat /var/run/sshd.pid`
B

相关内容