Linux whois命令详解

whois 命令用于查询域名注册信息、IP地址归属、网络管理员联系信息等。它通过查询WHOIS数据库获取互联网资源的注册信息,是网络管理员、安全研究员和域名投资者的重要工具。

1. 安装whois

1.1 不同发行版安装方法

Ubuntu/Debian系统:

sudo apt-get update
sudo apt-get install whois

CentOS/RHEL系统:

# CentOS/RHEL 7及以下
sudo yum install whois

# CentOS/RHEL 8及以上
sudo dnf install whois

Fedora系统:

sudo dnf install whois

macOS系统:

brew install whois

1.2 配置whois服务器(可选)

# 查看当前配置的whois服务器
grep -r "^[^#]" /etc/whois.conf 2>/dev/null || echo "使用默认配置"

# 创建自定义配置
sudo nano /etc/whois.conf
# 添加:com = whois.verisign-grs.com
# 添加:net = whois.verisign-grs.com
# 添加:org = whois.pir.org

2. 命令语法

whois [选项] [查询对象]

3. 常用选项

选项 说明
-h 主机--host 指定WHOIS服务器
-p 端口--port 指定WHOIS服务器端口(默认43)
-a 使用ARIN数据库(美国地区)
-r 使用RIPE数据库(欧洲地区)
-A 数据库 指定要查询的数据库
-i 属性 查询特定属性(如:admin, tech, owner等)
-B 显示精简输出(去除非关键信息)
-H 隐藏法律声明和免责声明
--verbose 显示详细输出
--help 显示帮助信息
--version 显示版本信息

4. 基本使用示例

4.1 查询域名信息

# 查询域名信息
whois example.com

# 查询多个域名
whois example.com example.org example.net

4.2 查询IP地址信息

# 查询IP地址信息
whois 8.8.8.8

# 查询IP段
whois 192.168.1.0/24

# 查询IPv6地址
whois 2001:4860:4860::8888

4.3 指定WHOIS服务器查询

# 指定特定的WHOIS服务器
whois -h whois.verisign-grs.com example.com

# 使用地区性WHOIS服务器
whois -h whois.apnic.net 8.8.8.8
whois -h whois.arin.net 8.8.8.8

4.4 查询特定信息

# 查询管理员联系信息
whois -i admin example.com

# 查询技术联系人信息
whois -i tech example.com

# 查询注册人信息
whois -i owner example.com

5. WHOIS输出解读

5.1 域名WHOIS输出关键字段

字段 说明 示例
Domain Name 域名 example.com
Registrar 注册商 GoDaddy.com, LLC
Registrar WHOIS Server 注册商WHOIS服务器 whois.godaddy.com
Creation Date 创建日期 1995-08-14T04:00:00Z
Updated Date 更新日期 2023-07-20T14:18:25Z
Registry Expiry Date 到期日期 2024-08-13T04:00:00Z
Name Server 域名服务器 ns1.example.com, ns2.example.com
Registrant Name 注册人姓名 John Doe
Registrant Organization 注册人组织 Example Inc.
Registrant Email 注册人邮箱 admin@example.com
Admin Email 管理员邮箱 admin@example.com
Tech Email 技术联系人邮箱 tech@example.com
Domain Status 域名状态 clientTransferProhibited

5.2 IP地址WHOIS输出关键字段

字段 说明 示例
NetRange/CIDR IP地址范围 8.8.8.0 - 8.8.8.255
CIDR CIDR表示法 8.8.8.0/24
NetName 网络名称 GOOGLE
NetHandle 网络句柄 NET-8-8-8-0-1
Parent 父网络 NET-8-0-0-0-0
NetType 网络类型 Direct Allocation
OriginAS 源自治系统 AS15169
Organization 组织名称 Google LLC
RegDate 注册日期 2014-03-14
Updated 更新日期 2023-05-15
Comment 备注 Google Inc.
Ref 参考信息 https://whois.arin.net/rest/net/NET-8-8-8-0-1

6. 实际应用场景

场景1:批量检查域名状态

#!/bin/bash
# 批量检查域名注册状态的脚本
DOMAIN_LIST="example.com example.org example.net"
REPORT_FILE="/tmp/domain_report_$(date +%Y%m%d).csv"

echo "域名,状态,注册商,创建日期,到期日期" > $REPORT_FILE

for DOMAIN in $DOMAIN_LIST; do
    echo "检查域名: $DOMAIN"

    # 执行whois查询
    WHOIS_OUTPUT=$(whois $DOMAIN 2>/dev/null)

    # 提取关键信息
    DOMAIN_NAME="$DOMAIN"
    STATUS=$(echo "$WHOIS_OUTPUT" | grep -i "domain status" | head -1 | cut -d: -f2 | xargs || echo "未知")
    REGISTRAR=$(echo "$WHOIS_OUTPUT" | grep -i "registrar:" | head -1 | cut -d: -f2 | xargs || echo "未知")
    CREATION_DATE=$(echo "$WHOIS_OUTPUT" | grep -i "creation date" | head -1 | cut -d: -f2- | xargs || echo "未知")
    EXPIRY_DATE=$(echo "$WHOIS_OUTPUT" | grep -i "expiry date\|registry expiry date" | head -1 | cut -d: -f2- | xargs || echo "未知")

    # 写入CSV文件
    echo "\"$DOMAIN_NAME\",\"$STATUS\",\"$REGISTRAR\",\"$CREATION_DATE\",\"$EXPIRY_DATE\"" >> $REPORT_FILE
done

echo "报告已生成: $REPORT_FILE"

场景2:网络安全调查

#!/bin/bash
# 网络安全调查脚本:分析可疑IP地址
IP_LIST="8.8.8.8 1.1.1.1 192.168.1.100"
INVESTIGATION_REPORT="/tmp/ip_investigation_$(date +%Y%m%d).txt"

echo "=== IP地址安全调查报告 ===" > $INVESTIGATION_REPORT
echo "生成时间: $(date)" >> $INVESTIGATION_REPORT
echo "=========================" >> $INVESTIGATION_REPORT

for IP in $IP_LIST; do
    echo -e "\n=== 分析IP地址: $IP ===" >> $INVESTIGATION_REPORT

    # WHOIS查询
    echo "WHOIS信息:" >> $INVESTIGATION_REPORT
    whois $IP | head -50 >> $INVESTIGATION_REPORT

    # 提取关键信息
    ORG=$(whois $IP 2>/dev/null | grep -i "organization\|orgname" | head -1 | cut -d: -f2 | xargs)
    COUNTRY=$(whois $IP 2>/dev/null | grep -i "country" | head -1 | cut -d: -f2 | xargs)
    NETRANGE=$(whois $IP 2>/dev/null | grep -i "netrange\|cidr" | head -1 | cut -d: -f2 | xargs)

    echo -e "\n摘要信息:" >> $INVESTIGATION_REPORT
    echo "组织: $ORG" >> $INVESTIGATION_REPORT
    echo "国家: $COUNTRY" >> $INVESTIGATION_REPORT
    echo "IP范围: $NETRANGE" >> $INVESTIGATION_REPORT

    # 风险评估
    echo -e "\n风险评估:" >> $INVESTIGATION_REPORT
    if [ "$ORG" = "Google LLC" ]; then
        echo "✓ 可信组织" >> $INVESTIGATION_REPORT
    elif [[ "$COUNTRY" =~ (CN|RU|IR|KP) ]]; then
        echo "⚠️  高风险国家" >> $INVESTIGATION_REPORT
    else
        echo "○ 一般风险" >> $INVESTIGATION_REPORT
    fi
done

echo "调查完成,报告已保存: $INVESTIGATION_REPORT"

场景3:域名投资分析

#!/bin/bash
# 域名投资分析工具
DOMAIN="$1"

if [ -z "$DOMAIN" ]; then
    echo "用法: $0 域名"
    echo "示例: $0 example.com"
    exit 1
fi

echo "=== 域名投资分析: $DOMAIN ==="
echo "分析时间: $(date)"
echo ""

# 执行whois查询
WHOIS_DATA=$(whois $DOMAIN 2>/dev/null)

# 检查域名是否可注册
if echo "$WHOIS_DATA" | grep -q "No match\|NOT FOUND\|No Data Found"; then
    echo "✅ 域名可注册!"
    echo "建议: 立即注册此域名"
    exit 0
fi

# 提取关键信息
REGISTRAR=$(echo "$WHOIS_DATA" | grep -i "registrar:" | head -1 | cut -d: -f2 | xargs)
CREATION_DATE=$(echo "$WHOIS_DATA" | grep -i "creation date" | head -1 | cut -d: -f2- | xargs)
EXPIRY_DATE=$(echo "$WHOIS_DATA" | grep -i "expiry date\|registry expiry date" | head -1 | cut -d: -f2- | xargs)
NAME_SERVERS=$(echo "$WHOIS_DATA" | grep -i "name server" | cut -d: -f2 | xargs | tr ' ' ',')

# 计算域名年龄(如果可能)
if [ -n "$CREATION_DATE" ]; then
    CREATION_TS=$(date -d "$CREATION_DATE" +%s 2>/dev/null || echo 0)
    CURRENT_TS=$(date +%s)
    if [ $CREATION_TS -gt 0 ]; then
        DAYS_OLD=$(( (CURRENT_TS - CREATION_TS) / 86400 ))
        YEARS_OLD=$(echo "scale=1; $DAYS_OLD / 365" | bc)
        echo "域名年龄: $DAYS_OLD 天 ($YEARS_OLD 年)"
    fi
fi

echo "注册商: $REGISTRAR"
echo "创建日期: $CREATION_DATE"
echo "到期日期: $EXPIRY_DATE"
echo "域名服务器: $NAME_SERVERS"

# 投资建议
echo -e "\n投资建议:"
if [ -n "$EXPIRY_DATE" ]; then
    EXPIRY_TS=$(date -d "$EXPIRY_DATE" +%s 2>/dev/null || echo 0)
    if [ $EXPIRY_TS -gt 0 ]; then
        DAYS_TO_EXPIRE=$(( (EXPIRY_TS - CURRENT_TS) / 86400 ))
        if [ $DAYS_TO_EXPIRE -lt 30 ]; then
            echo "⚠️  域名将在 $DAYS_TO_EXPIRE 天后过期"
            echo "建议: 关注过期删除,可能有机会抢注"
        elif [ $DAYS_TO_EXPIRE -lt 90 ]; then
            echo "⚠️  域名将在 $DAYS_TO_EXPIRE 天后过期"
            echo "建议: 可以尝试联系当前注册人购买"
        else
            echo "域名还有较长时间才过期"
        fi
    fi
fi

echo "分析完成"

7. 高级使用技巧

7.1 使用jwhois替代工具

# jwhois是whois的增强版本,支持更多功能
sudo apt-get install jwhois

# 使用jwhois查询
jwhois example.com

# 配置jwhois
nano ~/.jwhoisrc
# 添加配置:
# [com]
# server = whois.verisign-grs.com
# [net]
# server = whois.verisign-grs.com

7.2 批量查询脚本

#!/bin/bash
# 批量whois查询工具
INPUT_FILE="$1"
OUTPUT_DIR="./whois_results"

if [ -z "$INPUT_FILE" ] || [ ! -f "$INPUT_FILE" ]; then
    echo "用法: $0 输入文件"
    echo "输入文件每行一个域名或IP地址"
    exit 1
fi

mkdir -p $OUTPUT_DIR

echo "开始批量查询..."
while read -r TARGET; do
    # 跳过空行和注释
    [[ -z "$TARGET" ]] && continue
    [[ "$TARGET" =~ ^# ]] && continue

    echo "查询: $TARGET"

    # 生成安全文件名
    SAFE_NAME=$(echo "$TARGET" | tr -cd '[:alnum:]._-')
    OUTPUT_FILE="$OUTPUT_DIR/${SAFE_NAME}.txt"

    # 执行whois查询
    whois "$TARGET" > "$OUTPUT_FILE" 2>&1

    # 检查查询结果
    if [ $? -eq 0 ]; then
        echo "  结果已保存到: $OUTPUT_FILE"
    else
        echo "  查询失败: $TARGET"
    fi
done < "$INPUT_FILE"

echo "批量查询完成"

8. 相关命令对比

命令 功能 特点 适用场景
whois 域名/IP注册信息查询 标准WHOIS查询、支持多种对象 域名注册信息、IP归属查询
jwhois 增强版WHOIS查询 支持配置文件、缓存、重试 频繁查询、需要配置的场合
dig DNS查询工具 DNS记录查询、调试 域名解析、DNS配置
nslookup DNS查询工具 交互式DNS查询 DNS故障排除
host DNS查询工具 简单的DNS查询 快速DNS记录查询
traceroute 路由跟踪 显示数据包路径 网络路径分析
ping 网络连通性测试 测试主机可达性 网络连接测试

9. 故障排除

问题1:查询超时或无响应

# 检查网络连接
ping -c 3 whois.iana.org

# 指定其他WHOIS服务器
whois -h whois.verisign-grs.com example.com

# 增加超时时间(如果有相关选项)
timeout 30 whois example.com

# 检查防火墙设置
sudo iptables -L | grep 43  # WHOIS默认端口43

问题2:输出信息被截断或不完整

# 使用完整输出
whois --verbose example.com

# 重定向到文件查看完整输出
whois example.com > output.txt
less output.txt

# 使用管道处理
whois example.com | grep -A 100 "Domain Name:"

# 检查是否有输出限制
echo $COLUMNS $LINES  # 检查终端尺寸

问题3:无法查询某些顶级域名

# 对于特定的TLD,可能需要指定专门的WHOIS服务器
# .cn 域名使用CNNIC
whois -h whois.cnnic.cn example.cn

# .jp 域名使用JPRS
whois -h whois.jprs.jp example.jp

# .eu 域名使用EURid
whois -h whois.eu example.eu

# 查看支持的TLD和对应的服务器
ls /usr/share/whois/  # 某些系统有配置文件

10. 隐私和安全注意事项

WHOIS隐私警告

  1. 个人信息公开:WHOIS信息通常是公开的,任何人都可以查询
  2. 隐私保护服务:考虑使用域名注册商提供的隐私保护服务
  3. GDPR影响:欧盟的GDPR法规限制了个人信息的公开
  4. 滥用风险:公开的联系信息可能被用于垃圾邮件、诈骗等
  5. 企业信息:企业注册信息通常是公开的,但个人应考虑隐私

10.1 GDPR后的WHOIS变化

# GDPR实施后,许多WHOIS查询返回受限信息
# 示例:查询.eu域名(受GDPR影响明显)
whois example.eu

# 输出可能显示:
# Registrar: Example Registrar
# Registration period: 2023-01-01 to 2024-01-01
# Name servers: ns1.example.com, ns2.example.com
# >>> Personal data has been redacted due to GDPR <<<

11. 最佳实践

WHOIS查询最佳实践

  1. 使用正确的WHOIS服务器:针对不同的TLD使用相应的服务器
  2. 缓存查询结果:频繁查询时缓存结果以避免重复查询
  3. 遵守使用政策:遵守WHOIS服务器的使用频率限制
  4. 自动化处理:使用脚本处理批量查询和结果解析
  5. 验证信息准确性:WHOIS信息可能过时或不准确
  6. 保护隐私:注册域名时考虑隐私保护选项
  7. 记录查询日志:重要的调查应记录查询日志
  8. 结合其他工具:结合dig、nslookup等工具获取完整信息

11.1 自动化监控脚本

#!/bin/bash
# 域名到期监控脚本
DOMAINS_FILE="/etc/monitored_domains.txt"
ALERT_DAYS=30
LOG_FILE="/var/log/domain_monitor.log"

echo "$(date): 开始域名到期检查" >> $LOG_FILE

while read -r DOMAIN; do
    [[ -z "$DOMAIN" ]] && continue
    [[ "$DOMAIN" =~ ^# ]] && continue

    echo "检查域名: $DOMAIN"

    # 获取WHOIS信息
    WHOIS_INFO=$(whois $DOMAIN 2>/dev/null)

    # 提取到期日期
    EXPIRY_DATE=$(echo "$WHOIS_INFO" | grep -i "expiry date\|registry expiry date" | head -1 | cut -d: -f2- | xargs)

    if [ -n "$EXPIRY_DATE" ]; then
        # 计算剩余天数
        EXPIRY_TS=$(date -d "$EXPIRY_DATE" +%s 2>/dev/null || echo 0)
        CURRENT_TS=$(date +%s)

        if [ $EXPIRY_TS -gt 0 ]; then
            DAYS_LEFT=$(( (EXPIRY_TS - CURRENT_TS) / 86400 ))

            echo "域名 $DOMAIN 还有 $DAYS_LEFT 天到期" >> $LOG_FILE

            if [ $DAYS_LEFT -le $ALERT_DAYS ]; then
                echo "⚠️  警报: 域名 $DOMAIN 将在 $DAYS_LEFT 天后到期!" >> $LOG_FILE
                # 发送警报邮件
                echo "域名 $DOMAIN 将在 $DAYS_LEFT 天后到期 (到期日: $EXPIRY_DATE)" | \
                    mail -s "域名到期警报: $DOMAIN" admin@example.com
            fi
        fi
    else
        echo "警告: 无法获取域名 $DOMAIN 的到期信息" >> $LOG_FILE
    fi
done < "$DOMAINS_FILE"

echo "$(date): 域名到期检查完成" >> $LOG_FILE

12. 扩展应用

高级应用场景
1. 威胁情报收集
#!/bin/bash
# 威胁情报收集脚本
MALICIOUS_IPS="1.2.3.4 5.6.7.8"
THREAT_DB="/var/db/threat_intelligence.csv"

echo "timestamp,ip,organization,country,asn,threat_level" > $THREAT_DB

for IP in $MALICIOUS_IPS; do
    echo "分析威胁IP: $IP"

    # 获取WHOIS信息
    WHOIS_DATA=$(whois $IP)

    # 提取关键信息
    ORG=$(echo "$WHOIS_DATA" | grep -i "organization\|orgname" | head -1 | cut -d: -f2 | xargs)
    COUNTRY=$(echo "$WHOIS_DATA" | grep -i "country" | head -1 | cut -d: -f2 | xargs)
    ASN=$(echo "$WHOIS_DATA" | grep -i "originas\|origin" | head -1 | cut -d: -f2 | xargs)

    # 威胁等级评估
    THREAT_LEVEL="medium"
    if [[ "$COUNTRY" =~ (CN|RU|IR|KP) ]]; then
        THREAT_LEVEL="high"
    elif [[ "$ORG" =~ (Google|Microsoft|Amazon|Cloudflare) ]]; then
        THREAT_LEVEL="low"
    fi

    # 记录到数据库
    TIMESTAMP=$(date -Iseconds)
    echo "$TIMESTAMP,$IP,\"$ORG\",$COUNTRY,$ASN,$THREAT_LEVEL" >> $THREAT_DB

    echo "  组织: $ORG, 国家: $COUNTRY, ASN: $ASN, 威胁等级: $THREAT_LEVEL"
done

echo "威胁情报收集完成"
2. 品牌保护监控
#!/bin/bash
# 品牌保护域名监控
BRAND_NAME="mycompany"
TLD_LIST="com net org info biz"
REPORT_FILE="/tmp/brand_protection_$(date +%Y%m%d).txt"

echo "品牌保护监控报告 - $(date)" > $REPORT_FILE
echo "品牌名称: $BRAND_NAME" >> $REPORT_FILE
echo "=========================" >> $REPORT_FILE

for TLD in $TLD_LIST; do
    DOMAIN="${BRAND_NAME}.${TLD}"

    echo -e "\n检查域名: $DOMAIN" >> $REPORT_FILE

    # 检查域名注册状态
    if whois $DOMAIN 2>/dev/null | grep -q "No match\|NOT FOUND"; then
        echo "  状态: 可注册" >> $REPORT_FILE
        echo "  建议: 考虑注册以保护品牌" >> $REPORT_FILE
    else
        echo "  状态: 已注册" >> $REPORT_FILE

        # 获取注册人信息
        REGISTRANT=$(whois $DOMAIN 2>/dev/null | grep -i "registrant name\|registrant organization" | head -1)
        if [ -n "$REGISTRANT" ]; then
            echo "  注册人: $REGISTRANT" >> $REPORT_FILE
        fi

        # 检查是否是公司注册
        if echo "$REGISTRANT" | grep -qi "$BRAND_NAME"; then
            echo "  ✅ 由公司注册" >> $REPORT_FILE
        else
            echo "  ⚠️  由第三方注册" >> $REPORT_FILE
            echo "  建议: 调查是否需要采取行动" >> $REPORT_FILE
        fi
    fi
done

echo "品牌保护监控完成" >> $REPORT_FILE
echo "报告已保存: $REPORT_FILE"

实用技巧

  • 使用 grep 过滤WHOIS输出中的关键信息
  • 结合 awksed 解析WHOIS数据
  • 使用 whois -h 指定服务器避免查询限制
  • 对于批量查询,使用延迟避免被服务器屏蔽
  • 考虑使用专业的WHOIS API服务进行大规模查询
  • 定期检查自有域名的WHOIS信息是否准确
  • 使用 dig 配合 whois 进行完整域名调查