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隐私警告
- 个人信息公开:WHOIS信息通常是公开的,任何人都可以查询
- 隐私保护服务:考虑使用域名注册商提供的隐私保护服务
- GDPR影响:欧盟的GDPR法规限制了个人信息的公开
- 滥用风险:公开的联系信息可能被用于垃圾邮件、诈骗等
- 企业信息:企业注册信息通常是公开的,但个人应考虑隐私
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查询最佳实践
- 使用正确的WHOIS服务器:针对不同的TLD使用相应的服务器
- 缓存查询结果:频繁查询时缓存结果以避免重复查询
- 遵守使用政策:遵守WHOIS服务器的使用频率限制
- 自动化处理:使用脚本处理批量查询和结果解析
- 验证信息准确性:WHOIS信息可能过时或不准确
- 保护隐私:注册域名时考虑隐私保护选项
- 记录查询日志:重要的调查应记录查询日志
- 结合其他工具:结合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输出中的关键信息
- 结合
awk 和 sed 解析WHOIS数据
- 使用
whois -h 指定服务器避免查询限制
- 对于批量查询,使用延迟避免被服务器屏蔽
- 考虑使用专业的WHOIS API服务进行大规模查询
- 定期检查自有域名的WHOIS信息是否准确
- 使用
dig 配合 whois 进行完整域名调查