由于某种原因,我有以下场景:
在启动时,我会启动一个脚本,它会等待一段给定的时间,并检查在此时间窗口内是否建立了 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