fwhois 是一个用于查询系统用户信息的Linux/Unix工具,它可以显示当前登录系统的用户信息。它是finger命令的一个变体或简化版本,通常用于快速查看谁登录了系统。
util-linux软件包中,但具体可用性取决于发行版。在某些系统中,它可能被链接到finger命令。
在基于Debian/Ubuntu的系统上,fwhois通常包含在util-linux包中:
sudo apt-get update
sudo apt-get install util-linux
在某些系统中,可能需要单独安装:
# 尝试搜索可用的包
apt-cache search fwhois
# 如果不可用,可以安装finger命令作为替代
sudo apt-get install finger
在基于RHEL/CentOS的系统上:
sudo yum install util-linux
# 或者
sudo dnf install util-linux
fwhois [选项] [用户名]
如果不指定用户名,fwhois将显示所有登录用户的信息。
| 选项 | 说明 |
|---|---|
-h, --help |
显示帮助信息 |
-V, --version |
显示版本信息 |
-l, --lookup |
显示用户的详细信息 |
-s, --short |
简短格式显示 |
-m |
只匹配登录名 |
# 显示当前所有登录用户
fwhois
# 简短格式显示
fwhois -s
输出示例:
user1 tty1 2024-01-15 09:30
user2 pts/0 2024-01-15 10:15 (:0)
user3 pts/1 2024-01-15 11:20 (192.168.1.100)
# 查询用户user1的信息
fwhois user1
# 显示详细信息
fwhois -l user1
# 比较fwhois、who、w、finger的输出
echo "=== fwhois ==="
fwhois
echo ""
echo "=== who ==="
who
echo ""
echo "=== w ==="
w
echo ""
echo "=== finger ==="
finger 2>/dev/null || echo "finger not available"
fwhois的标准输出包含以下字段:
| 字段 | 说明 | 示例 |
|---|---|---|
| 用户名 | 登录系统的用户名 | john |
| 终端 | 用户使用的终端设备 | tty1, pts/0, pts/1 |
| 登录时间 | 用户登录系统的时间 | 2024-01-15 09:30 |
| 来源 | 登录来源(远程主机或显示) | (:0), (192.168.1.100) |
| 命令 | 主要功能 | 输出详细程度 | 可用性 |
|---|---|---|---|
fwhois |
显示登录用户信息 | 中等 | 有限,某些发行版不包含 |
who |
显示登录用户信息 | 基本 | 所有系统 |
w |
显示登录用户及活动 | 详细 | 所有系统 |
finger |
显示用户详细信息 | 最详细 | 需要安装 |
users |
显示登录用户名 | 最简单 | 所有系统 |
last |
显示登录历史 | 历史记录 | 所有系统 |
#!/bin/bash
# monitor_logins.sh - 使用fwhois监控登录用户
LOG_FILE="/var/log/user_monitor.log"
echo "用户登录监控 - $(date)" >> "$LOG_FILE"
echo "============================" >> "$LOG_FILE"
# 使用fwhois获取当前登录用户
fwhois_output=$(fwhois 2>/dev/null)
if [ -z "$fwhois_output" ]; then
echo "没有用户登录或fwhois不可用" >> "$LOG_FILE"
# 尝试使用who作为备用
echo "备用方案 - 使用who命令:" >> "$LOG_FILE"
who >> "$LOG_FILE"
else
echo "当前登录用户:" >> "$LOG_FILE"
echo "$fwhois_output" >> "$LOG_FILE"
# 统计用户数
user_count=$(echo "$fwhois_output" | wc -l)
echo "总登录用户数: $user_count" >> "$LOG_FILE"
# 检查是否有异常登录
if [ $user_count -gt 5 ]; then
echo "警告: 检测到 $user_count 个并发登录,可能异常" >> "$LOG_FILE"
fi
fi
echo "" >> "$LOG_FILE"
echo "监控完成" >> "$LOG_FILE"
# 显示最近几行日志
echo "最近监控记录:"
tail -10 "$LOG_FILE"
#!/bin/bash
# login_notify.sh - 用户登录提醒
# 检查特定用户是否登录
check_user_login() {
local username="$1"
# 尝试使用fwhois
if command -v fwhois &> /dev/null; then
if fwhois "$username" 2>/dev/null | grep -q "^$username"; then
echo "用户 $username 已登录 (通过 fwhois 检测)"
return 0
fi
fi
# 备用方案:使用who
if who | grep -q "^$username"; then
echo "用户 $username 已登录 (通过 who 检测)"
return 0
fi
echo "用户 $username 未登录"
return 1
}
# 检查多个用户
USERS_TO_CHECK=("admin" "root" "john")
for user in "${USERS_TO_CHECK[@]}"; do
if check_user_login "$user"; then
# 发送通知(示例:记录到日志)
echo "$(date): 用户 $user 已登录系统" >> /var/log/login_notifications.log
# 可以添加邮件通知
# echo "用户 $user 于 $(date) 登录系统" | mail -s "登录通知" admin@example.com
fi
done
#!/bin/bash
# generate_login_report.sh - 生成登录用户报告
REPORT_FILE="/tmp/login_report_$(date +%Y%m%d_%H%M%S).txt"
echo "系统登录用户报告" > "$REPORT_FILE"
echo "生成时间: $(date)" >> "$REPORT_FILE"
echo "=====================================" >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
# 尝试使用fwhois,如果不可用则使用who
if command -v fwhois &> /dev/null; then
echo "使用 fwhois 命令:" >> "$REPORT_FILE"
fwhois >> "$REPORT_FILE" 2>/dev/null || echo "fwhois 执行失败" >> "$REPORT_FILE"
else
echo "fwhois 不可用,使用 who 命令:" >> "$REPORT_FILE"
who >> "$REPORT_FILE"
fi
echo "" >> "$REPORT_FILE"
echo "=== 补充信息 ===" >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
# 使用w命令获取更多信息
echo "使用 w 命令获取详细信息:" >> "$REPORT_FILE"
w >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
echo "=== 系统运行时间 ===" >> "$REPORT_FILE"
uptime >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
echo "报告生成完成,保存到: $REPORT_FILE"
echo "报告内容预览:"
cat "$REPORT_FILE"
fwhois: command not found
解决方案:
# 1. 检查命令是否真的不存在
which fwhois
type fwhois
# 2. 安装util-linux包
sudo apt-get install util-linux
# 或
sudo yum install util-linux
# 3. 如果不可用,使用替代命令
who
w
finger
# 4. 检查命令的别名
alias | grep fwhois
# fwhois执行但没有输出,或输出错误信息
解决方案:
# 1. 检查是否有用户登录
who
# 如果没有用户登录,fwhois可能无输出
# 2. 检查权限
ls -l $(which fwhois 2>/dev/null || echo "/usr/bin/fwhois")
# 3. 尝试使用完整路径
/usr/bin/fwhois
# 4. 检查系统日志
dmesg | grep -i fwhois
journalctl | grep -i fwhois
# 在某些系统中,fwhois可能是finger的链接
ls -l $(which fwhois 2>/dev/null)
解决方案:
# 检查是否是符号链接
if [ -L "$(which fwhois 2>/dev/null)" ]; then
echo "fwhois 是一个符号链接"
ls -l $(which fwhois)
fi
# 如果是链接到finger,那么行为与finger相同
# 可以使用finger的选项
| 命令 | 说明 |
|---|---|
who |
显示当前登录系统的用户信息 |
w |
显示登录用户及其活动 |
finger |
显示用户详细信息,包括.plan文件 |
users |
显示登录用户名 |
last |
显示登录历史记录 |
lastlog |
显示所有用户最后登录时间 |
loginctl |
systemd登录管理器控制工具 |
id |
显示用户身份信息 |
whoami |
显示当前用户名 |
pinky |
轻量级finger替代工具 |
在不同的Linux发行版和Unix变体中,fwhois的实现可能有所不同:
# 在Debian/Ubuntu上,fwhois通常包含在util-linux包中
dpkg -S $(which fwhois 2>/dev/null) || echo "未安装"
# 检查相关文件
ls -l /usr/bin/fwhois /usr/bin/who /usr/bin/finger 2>/dev/null
# 在RHEL/CentOS上
rpm -qf $(which fwhois 2>/dev/null) || echo "未安装"
# 检查是否在util-linux包中
yum provides */fwhois
dnf provides */fwhois
# 在FreeBSD、OpenBSD等系统中,fwhois可能不可用
# 通常使用who或finger代替
whereis fwhois
which fwhois
由于fwhois的可用性有限,以下是最佳替代方案:
# who是最可靠的替代方案
who
# 格式化输出,类似fwhois
who | awk '{print $1, $2, $3, $4, $5}'
# 带标题的输出
echo "用户名 终端 登录时间 来源"
who | awk '{print $1, $2, $3" "$4, $5}'
# w提供更详细的信息
w
# 只显示用户列表
w -h | awk '{print $1, $2, $3, $4, $5}'
# 简短格式
w -s
# 显示当前登录用户(最近)
last | head -20
# 显示特定用户
last john
#!/bin/bash
# user_info_compat.sh - 兼容的用户信息查询
# 函数:获取用户信息
get_user_info() {
# 尝试使用fwhois
if command -v fwhois &> /dev/null; then
echo "使用 fwhois:"
fwhois "$@" 2>/dev/null && return 0
fi
# 尝试使用finger
if command -v finger &> /dev/null; then
echo "使用 finger:"
finger "$@" 2>/dev/null && return 0
fi
# 使用who(最可靠)
echo "使用 who:"
if [ $# -eq 0 ]; then
who
else
for user in "$@"; do
who | grep "^$user"
done
fi
}
# 函数:获取详细用户信息
get_user_info_detailed() {
# 尝试使用w
if command -v w &> /dev/null; then
echo "使用 w:"
w -s 2>/dev/null && return 0
fi
# 回退到who
echo "使用 who (详细格式):"
who -a
}
# 主程序
echo "用户信息查询工具"
echo "================="
echo ""
case "${1:-}" in
-d|--detail|--detailed)
get_user_info_detailed
;;
-h|--help)
echo "用法: $0 [选项] [用户名...]"
echo "选项:"
echo " -d, --detail 显示详细信息"
echo " -h, --help 显示此帮助"
echo " 无选项 显示基本用户信息"
exit 0
;;
*)
get_user_info "$@"
;;
esac
#!/bin/bash
# user_login_audit.sh - 用户登录审计
AUDIT_LOG="/var/log/user_audit.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
# 记录审计开始
echo "=== 用户登录审计 $TIMESTAMP ===" >> "$AUDIT_LOG"
# 获取当前登录用户(使用最佳可用方法)
echo "当前登录用户:" >> "$AUDIT_LOG"
if command -v fwhois &> /dev/null; then
fwhois >> "$AUDIT_LOG" 2>/dev/null
elif command -v who &> /dev/null; then
who >> "$AUDIT_LOG"
else
echo "无法获取登录用户信息" >> "$AUDIT_LOG"
fi
# 获取系统运行时间
echo "" >> "$AUDIT_LOG"
echo "系统运行时间:" >> "$AUDIT_LOG"
uptime >> "$AUDIT_LOG" 2>/dev/null
# 获取用户登录历史
echo "" >> "$AUDIT_LOG"
echo "最近登录记录:" >> "$AUDIT_LOG"
last -10 >> "$AUDIT_LOG" 2>/dev/null
# 统计信息
echo "" >> "$AUDIT_LOG"
echo "统计信息:" >> "$AUDIT_LOG"
echo "总用户数: $(getent passwd | wc -l)" >> "$AUDIT_LOG"
echo "普通用户数: $(getent passwd | awk -F: '$3 >= 1000 && $3 < 60000' | wc -l)" >> "$AUDIT_LOG"
echo "当前登录用户数: $(who | wc -l)" >> "$AUDIT_LOG"
echo "审计完成,日志保存在: $AUDIT_LOG"
fwhois命令是Unix传统工具的一部分:
finger命令的简化版本who和w命令替代了fwhois| 用途 | 命令示例 | 替代命令 |
|---|---|---|
| 显示所有登录用户 | fwhois |
who, w |
| 查询特定用户 | fwhois username |
who | grep username |
| 简短格式 | fwhois -s |
w -s |
| 详细信息 | fwhois -l |
finger username |
| 帮助信息 | fwhois -h |
man who |
| 版本信息 | fwhois -V |
N/A |
who、w等标准命令虽然fwhois在某些系统上可能可用,但为了脚本的可移植性和可靠性,建议使用更标准的命令如who、w来获取用户登录信息。这些命令在所有Linux/Unix系统上都可用,并且功能更加强大和稳定。