Linux ftpwho命令用于显示当前连接到FTP服务器的用户信息和状态,类似于who命令但专门用于FTP服务。
ftpwho [选项]
| 选项 | 说明 |
|---|---|
-v |
显示详细信息 |
-V |
显示版本信息 |
-h |
显示帮助信息 |
--help |
显示帮助信息 |
# 查看当前FTP服务器上的所有连接
ftpwho
# 输出示例:
# Service class all:
# 10477 ? S 0:00 ftpd: 192.168.1.100: anonymous/alice@example.com: IDLE
# 10478 ? S 0:00 ftpd: 192.168.1.101: bob: RETR file.txt
# -
# 2 users (no maximum)
# 解释:
# 第一列:进程ID
# 第二列:终端
# 第三列:状态
# 第四列:运行时间
# 第五列:连接详细信息(客户端IP、用户名、当前操作)
# 显示详细的连接信息
ftpwho -v
# 输出可能包含更多字段,如:
# - 文件传输进度
# - 连接时间
# - 数据传输速率
# - 命令历史
# 如果系统运行多个FTP服务器实例,可能需要指定配置文件
ftpwho -c /etc/ftpaccess
# 或指定PID文件
ftpwho -p /var/run/ftpd.pid
#!/bin/bash
# 统计FTP服务器当前连接数的脚本
# 获取连接总数
TOTAL_CONNECTIONS=$(ftpwho | grep -c "^[0-9]")
# 获取匿名连接数
ANONYMOUS_CONNECTIONS=$(ftpwho | grep -c "anonymous")
# 获取活跃传输数
ACTIVE_TRANSFERS=$(ftpwho | grep -c -E "(RETR|STOR|STOU|APPE)")
echo "FTP连接统计报告"
echo "================="
echo "总连接数: $TOTAL_CONNECTIONS"
echo "匿名连接: $ANONYMOUS_CONNECTIONS"
echo "活跃传输: $ACTIVE_TRANSFERS"
echo "生成时间: $(date)"
# 如果连接数超过阈值,发送警告
MAX_CONNECTIONS=50
if [ "$TOTAL_CONNECTIONS" -gt "$MAX_CONNECTIONS" ]; then
echo "警告:连接数超过阈值 ($MAX_CONNECTIONS)!"
# 这里可以添加发送邮件或其他通知的代码
fi
# 查找特定用户的FTP连接
ftpwho | grep "alice"
# 监控多个用户
ftpwho | grep -E "(alice|bob|charlie)"
# 排除匿名用户
ftpwho | grep -v "anonymous"
# 每5秒刷新一次FTP连接状态
watch -n 5 ftpwho
# 使用循环实现类似效果
while true; do
clear
echo "FTP连接监控 - $(date)"
echo "=========================="
ftpwho
sleep 5
done
# 查找占用资源最多的FTP连接
ftpwho | sort -k4 -rn | head -5
# 统计每个IP的连接数
ftpwho | awk '{print $5}' | awk -F: '{print $2}' | sort | uniq -c | sort -rn
# 生成连接时间报告
ftpwho | awk '{print $4}' | awk -F: '{print $1*60+$2}' | sort -n | head -1
| 字段 | 说明 | 示例 |
|---|---|---|
| PID | 进程ID | 10477 |
| TTY | 终端设备 | ?(无终端) |
| STAT | 进程状态 S: 休眠 R: 运行 Z: 僵尸 |
S |
| TIME | CPU时间(分:秒) | 0:00 |
| COMMAND | 连接详细信息 | ftpd: 192.168.1.100: anonymous/alice@example.com: IDLE |
ftpd: [客户端IP]: [用户名/认证信息]: [当前状态]
# 各部分说明:
# ftpd: FTP守护进程
# 客户端IP: 连接客户端的IP地址
# 用户名: 登录用户名(anonymous表示匿名用户)
# 认证信息: 匿名用户的邮箱或其他认证信息
# 当前状态: 当前操作状态,常见值:
# - IDLE: 空闲
# - RETR: 下载文件
# - STOR: 上传文件
# - STOU: 唯一文件名上传
# - APPE: 追加到文件
# - LIST: 列出目录
# - NLST: 名称列表
# - RNFR/RNTO: 重命名
# - DELE: 删除文件
# - MKD: 创建目录
# - RMD: 删除目录
ftpcount或服务器特定工具)# ftpcount显示连接数统计(通常与ftpwho一起安装)
ftpcount
# 输出示例:
# Service class all - 2 users (no maximum)
# 显示当前连接数和最大允许连接数
# 使用ps命令查看FTP进程
ps aux | grep ftpd
# 使用netstat查看FTP连接
netstat -tpn | grep :21
# 使用ss命令(现代替代netstat)
ss -tpn | grep :21
# 查看FTP服务器日志(位置因服务器而异)
tail -f /var/log/xferlog # 传输日志
tail -f /var/log/vsftpd.log # vsftpd日志
tail -f /var/log/proftpd/access.log # proftpd访问日志
# Ubuntu/Debian系统
sudo apt-get update
sudo apt-get install wu-ftpd
# CentOS/RHEL系统(可能需要EPEL仓库)
sudo yum install epel-release
sudo yum install wu-ftpd
# 验证安装
which ftpwho
ftpwho --version
# 编辑wu-ftpd配置文件
sudo nano /etc/wu-ftpd/ftpaccess
# 确保以下配置启用(示例)
log commands real
log transfers anonymous,real inbound,outbound
log syslog
log security
# 重启FTP服务器使配置生效
sudo systemctl restart wu-ftpd
可能原因: FTP服务器未运行或没有活动连接
解决: 检查FTP服务器状态
# 检查FTP服务器是否运行
systemctl status wu-ftpd
# 或检查进程
ps aux | grep ftpd
解决: 使用sudo或以root用户运行
# 使用sudo运行
sudo ftpwho
# 或切换到root用户
sudo su -
ftpwho
可能原因: FTP服务器类型不同
解决: 查看对应FTP服务器的文档
# 检查FTP服务器类型
ps aux | grep ftpd | grep -v grep
# 根据服务器类型使用相应的监控工具
解决: 安装wu-ftpd软件包
# Ubuntu/Debian
sudo apt-get install wu-ftpd
# CentOS/RHEL
sudo yum install wu-ftpd
对于现代FTP服务器,可能有不同的监控工具:
systemctl status vsftpd和日志文件ftptop或ftpwho(proftpd版本)pure-ftpwhonetstat、ss、lsof查看连接# 使用netstat查看FTP连接
netstat -tpn | grep :21
# 使用ss查看FTP连接
ss -tpn | grep :21
# 使用lsof查看FTP相关进程
lsof -i :21
# 查看FTP数据传输端口(被动模式)
netstat -tpn | grep -E ':(20|1024-65535)' | grep ftp
ftpcount - 显示FTP服务器连接计数ftpshut - 计划关闭FTP服务器ftprestart - 重启FTP服务器who - 显示当前登录系统的用户w - 显示当前登录用户及其活动last - 显示用户登录历史