是否有办法检查本地主机是否正在与其他服务器进行ftp连接?
需求是这样的:本地主机-> serverA远程服务器--> serverB.
需要检查serverA是否与serververb建立ftp连接。
所以当serverA与serverB建立ftp连接时,如何得到通知。
我试过了:ps -ef | grep -i ftp;然而,由于ps进程也会收到通知,所以不能在shell脚本中使用这个,有没有更好的方法来检查serverA是否正在与serverB建立ftp连接,如果是,得到通知/记录到一个文件。
谢谢
你的问题"ps -ef | grep -i ftp"也报告了'ps'进程是由grep搜索字符串"ftp"导致的。这也会影响到许多其他命令行中也有"ftp"这个词的进程。
要解决这个问题,请检查是否安装了procps工具"pgrep"one_answers"pkill"。它们对于"grepping"进程和运行命令行非常有帮助。
要解决最初的问题,您可以检查是否安装了'ss'(从iproute2包中显示套接字)命令。
它的输出可能是有用的(11.22.33.44是你的本地IP 130.133.3.130远程):
root:sigkill:~/# ss -p|cat
State Recv-Q Send-Q Local Address:Port Peer Address:Port
[...]
ESTAB 0 0 11.22.33.44:43681 130.133.3.130:ftp users:(("ftp",19729,4),("ftp",19729,3))
[...]
您可以采用以下几种方法:
- 您可以为
ftp
轮询正在运行的进程。这不会捕获其他FTP客户端(如果您关心的话),也不会捕获轮询之间滑动的非常短的FTP会话。 - 如果您的系统支持执行日志,您可以记录
ftp
的所有执行。同样,这不会捕获其他FTP客户机。 - 您可以使用系统提供的某些机制监视端口21/tcp上的出站连接(例如,在Linux上,使用
iptables
规则匹配到您关心的任何服务器的出站FTP连接,并使用LOG
目标记录它们)。这将捕获所有连接,而不管客户端是什么,但是跟踪过程和用户会有点复杂。
可以使用$ grep ftp /etc/services
列出当前ftp连接。
$ grep ftp /etc/services
ftp-data 20/tcp
ftp-data 20/udp
...
ftp 21/tcp
ftp 21/udp fsp fspd
...
sftp 115/tcp
sftp 115/udp
...
ftp-data 20/sctp # FTP
ftp 21/sctp # FTP
...
ftps-data 989/tcp # ftp protocol, data, over TLS/SSL
ftps-data 989/udp # ftp protocol, data, over TLS/SSL
ftps 990/tcp # ftp protocol, control, over TLS/SSL
ftps 990/udp # ftp protocol, control, over TLS/SSL
使用netstat查看打开的连接。例如,对于简单的FTP…
$ netstat -tan | grep :21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
tcp 0 0 :::21 :::* LISTEN