ifconfig 是一个用于配置和显示网络接口参数的传统网络管理工具。它可以用来配置网络接口的IP地址、子网掩码、广播地址等,也可以用来启用或禁用网络接口。虽然现代Linux系统推荐使用ip命令,但ifconfig在许多系统管理和脚本中仍然广泛使用。
ifconfig已被视为过时工具,推荐使用ip命令。但它仍然在很多脚本和系统管理员的工作中广泛使用。
# 基本格式
ifconfig [接口] [选项] [地址]
# 常用格式
ifconfig # 显示所有网络接口
ifconfig eth0 # 显示特定接口
ifconfig eth0 192.168.1.100 # 配置IP地址
ifconfig eth0 up # 启用接口
ifconfig eth0 down # 禁用接口
| 功能 | ifconfig 命令 |
ip 命令 |
|---|---|---|
| 显示接口信息 | ifconfig |
ip addr show 或 ip a |
| 启用接口 | ifconfig eth0 up |
ip link set eth0 up |
| 禁用接口 | ifconfig eth0 down |
ip link set eth0 down |
| 配置IP地址 | ifconfig eth0 192.168.1.100 |
ip addr add 192.168.1.100/24 dev eth0 |
| 删除IP地址 | ifconfig eth0 0.0.0.0 |
ip addr del 192.168.1.100/24 dev eth0 |
| 显示路由表 | route -n |
ip route show 或 ip r |
| 添加默认网关 | route add default gw 192.168.1.1 |
ip route add default via 192.168.1.1 |
| 显示ARP表 | arp -a |
ip neigh show |
| 状态 | 传统工具,逐步淘汰 | 现代工具,推荐使用 |
| 功能完整性 | 基本功能 | 功能更完整和强大 |
在一些较新的Linux发行版中,ifconfig可能没有预装,需要手动安装net-tools包:
# 1. 检查是否已安装
which ifconfig
# 或
ifconfig --help 2>/dev/null || echo "ifconfig未安装"
# 2. Debian/Ubuntu
sudo apt-get update
sudo apt-get install net-tools
# 3. RHEL/CentOS
sudo yum install net-tools
# 或
sudo dnf install net-tools
# 4. Arch Linux
sudo pacman -S net-tools
# 5. openSUSE
sudo zypper install net-tools
# 6. Alpine Linux
sudo apk add net-tools
# 7. 验证安装
ifconfig
# 应该显示网络接口信息
# 8. 查看ifconfig版本
ifconfig --version
# 输出示例:net-tools 2.10-alpha
# 9. 相关工具
# net-tools包含的其他有用工具:
# - arp: 管理ARP缓存
# - route: 管理路由表
# - netstat: 网络统计信息
# - rarp: 反向地址解析协议
# - hostname: 显示或设置主机名
# - nameif: 基于MAC地址命名接口
# - plipconfig: 配置PLIP接口
# - slattach: 串行线接口连接
# 10. 从源码编译(不推荐)
wget https://sourceforge.net/projects/net-tools/files/net-tools-2.10.tar.xz
tar -xf net-tools-2.10.tar.xz
cd net-tools-2.10
./configure
make
sudo make install
使用ifconfig进行基本的网络接口管理:
# 1. 显示所有活动接口
ifconfig
# 输出示例:
# eth0: flags=4163 mtu 1500
# inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
# inet6 fe80::a00:27ff:fe4e:66a1 prefixlen 64 scopeid 0x20
# ether 08:00:27:4e:66:a1 txqueuelen 1000 (Ethernet)
# RX packets 123456 bytes 123456789 (117.7 MiB)
# RX errors 0 dropped 0 overruns 0 frame 0
# TX packets 98765 bytes 98765432 (94.1 MiB)
# TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 2. 显示所有接口(包括未激活的)
ifconfig -a
# 显示所有网络接口,包括未启用的
# 3. 显示特定接口
ifconfig eth0
# 只显示eth0接口的信息
# 4. 显示简短信息
ifconfig -s
# 输出示例:
# Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
# eth0 1500 123456 0 0 0 98765 0 0 0 BMRU
# lo 65536 1234 0 0 0 1234 0 0 0 LRU
# 5. 启用网络接口
sudo ifconfig eth0 up
# 或
sudo ifup eth0
# 6. 禁用网络接口
sudo ifconfig eth0 down
# 或
sudo ifdown eth0
# 7. 配置IP地址
sudo ifconfig eth0 192.168.1.100
# 设置eth0的IP地址为192.168.1.100
# 8. 配置IP地址和子网掩码
sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0
# 同时设置IP和子网掩码
# 9. 配置IP地址、子网掩码和广播地址
sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
# 10. 为接口添加多个IP地址
sudo ifconfig eth0:0 192.168.1.101
sudo ifconfig eth0:1 192.168.1.102
# 创建虚拟接口 eth0:0, eth0:1
# 11. 删除IP地址
sudo ifconfig eth0 0.0.0.0
# 清除eth0的所有IP地址
# 12. 删除虚拟接口
sudo ifconfig eth0:0 down
# 或
sudo ifconfig eth0:0 0.0.0.0
# 13. 设置MAC地址
sudo ifconfig eth0 hw ether 00:11:22:33:44:55
# 注意:需要先禁用接口
sudo ifconfig eth0 down
sudo ifconfig eth0 hw ether 00:11:22:33:44:55
sudo ifconfig eth0 up
# 14. 设置MTU(最大传输单元)
sudo ifconfig eth0 mtu 9000
# 设置MTU为9000字节(用于Jumbo frames)
# 15. 启用/禁用ARP
sudo ifconfig eth0 arp # 启用ARP
sudo ifconfig eth0 -arp # 禁用ARP
# 16. 启用/禁用混杂模式
sudo ifconfig eth0 promisc # 启用混杂模式(监听所有流量)
sudo ifconfig eth0 -promisc # 禁用混杂模式
# 17. 查看接口统计信息
ifconfig eth0
# 查看RX/TX数据包统计
# 18. 重置接口统计
sudo ifconfig eth0 0
# 重置统计计数器
# 19. 检查接口状态
ifconfig eth0 | grep "flags"
# 输出示例:UP, BROADCAST, RUNNING, MULTICAST 表示接口正常
# 20. 验证网络连接
ping -c 3 8.8.8.8
# 测试网络连通性
使用ifconfig进行高级网络配置:
#!/bin/bash
# 高级网络配置脚本
# 1. 配置静态IP地址
configure_static_ip() {
local iface=$1
local ip=$2
local netmask=$3
local gateway=${4:-""}
echo "配置静态IP: $iface -> $ip/$netmask"
# 禁用接口
sudo ifconfig $iface down
# 配置IP地址
sudo ifconfig $iface $ip netmask $netmask
# 启用接口
sudo ifconfig $iface up
# 配置网关(如果需要)
if [ -n "$gateway" ]; then
echo "配置默认网关: $gateway"
sudo route add default gw $gateway
fi
echo "配置完成"
}
# 2. 配置DHCP
configure_dhcp() {
local iface=$1
echo "配置DHCP: $iface"
# 释放当前IP
sudo dhclient -r $iface
# 获取新IP
sudo dhclient $iface
# 显示新配置
ifconfig $iface
}
# 3. 创建虚拟局域网(VLAN)
create_vlan() {
local base_iface=$1
local vlan_id=$2
local ip=$3
local netmask=$4
local vlan_iface="${base_iface}.${vlan_id}"
echo "创建VLAN: $vlan_iface -> $ip/$netmask"
# 加载VLAN模块
sudo modprobe 8021q
# 创建VLAN接口
sudo vconfig add $base_iface $vlan_id
# 配置IP地址
sudo ifconfig $vlan_iface $ip netmask $netmask up
echo "VLAN创建完成"
}
# 4. 创建网桥
create_bridge() {
local br_name=$1
shift
local interfaces=("$@")
echo "创建网桥: $br_name"
# 安装网桥工具
if ! command -v brctl &> /dev/null; then
sudo apt-get install bridge-utils || sudo yum install bridge-utils
fi
# 创建网桥
sudo brctl addbr $br_name
# 添加接口到网桥
for iface in "${interfaces[@]}"; do
echo "添加接口到网桥: $iface"
sudo brctl addif $br_name $iface
done
# 启用网桥
sudo ifconfig $br_name up
echo "网桥创建完成"
}
# 5. 创建绑定接口(Bonding)
create_bond() {
local bond_iface=$1
local mode=$2
shift 2
local slave_ifaces=("$@")
echo "创建绑定接口: $bond_iface (模式: $mode)"
# 加载绑定模块
sudo modprobe bonding mode=$mode
# 创建绑定接口
sudo ifconfig $bond_iface 0.0.0.0 up
# 配置绑定参数
echo "$mode" | sudo tee /sys/class/net/$bond_iface/bonding/mode
# 添加从属接口
for iface in "${slave_ifaces[@]}"; do
echo "添加从属接口: $iface"
echo "+$iface" | sudo tee /sys/class/net/$bond_iface/bonding/slaves
done
echo "绑定接口创建完成"
}
# 6. 创建IP隧道
create_tunnel() {
local tunnel_iface=$1
local local_ip=$2
local remote_ip=$3
local tunnel_ip=$4
echo "创建IP隧道: $tunnel_iface"
# 创建GRE隧道
sudo ip tunnel add $tunnel_iface mode gre local $local_ip remote $remote_ip ttl 255
# 配置隧道IP
sudo ifconfig $tunnel_iface $tunnel_ip up
echo "IP隧道创建完成"
}
# 7. 配置网络别名(多个IP)
configure_aliases() {
local base_iface=$1
local network=$2
local start_ip=$3
local count=$4
echo "为 $base_iface 配置 $count 个别名IP"
for i in $(seq 0 $((count-1))); do
ip_octet=$((start_ip + i))
alias_ip="${network}.${ip_octet}"
alias_iface="${base_iface}:${i}"
echo "配置别名: $alias_iface -> $alias_ip"
sudo ifconfig $alias_iface $alias_ip up
done
}
# 8. 网络诊断工具
network_diagnostics() {
local iface=$1
echo "=== 网络诊断: $iface ==="
echo ""
# 接口状态
echo "1. 接口状态:"
ifconfig $iface
echo ""
# 路由表
echo "2. 路由表:"
route -n | grep $iface
echo ""
# ARP缓存
echo "3. ARP缓存:"
arp -a
echo ""
# 网络统计
echo "4. 网络统计:"
netstat -i
echo ""
# 连通性测试
echo "5. 连通性测试:"
ping -c 2 -I $iface 8.8.8.8
}
# 9. 保存网络配置
save_network_config() {
local iface=$1
local config_file="/etc/network/interfaces.d/$iface"
echo "保存网络配置: $iface -> $config_file"
# 获取当前配置
local ip=$(ifconfig $iface | grep "inet " | awk '{print $2}')
local netmask=$(ifconfig $iface | grep "inet " | awk '{print $4}')
local broadcast=$(ifconfig $iface | grep "inet " | awk '{print $6}')
# 创建配置文件
cat > /tmp/$iface.cfg << EOF
# 网络接口配置: $iface
auto $iface
iface $iface inet static
address $ip
netmask $netmask
broadcast $broadcast
EOF
# 保存配置
sudo cp /tmp/$iface.cfg $config_file
echo "配置已保存到: $config_file"
}
# 10. 恢复网络配置
restore_network_config() {
local iface=$1
local config_file="/etc/network/interfaces.d/$iface"
if [ -f "$config_file" ]; then
echo "恢复网络配置: $iface"
sudo ifdown $iface
sudo ifup $iface
else
echo "配置文件不存在: $config_file"
fi
}
# 主菜单
main_menu() {
while true; do
clear
echo "=== 高级网络配置工具 ==="
echo ""
echo "1. 配置静态IP"
echo "2. 配置DHCP"
echo "3. 创建VLAN"
echo "4. 创建网桥"
echo "5. 创建绑定接口"
echo "6. 创建IP隧道"
echo "7. 配置网络别名"
echo "8. 网络诊断"
echo "9. 保存配置"
echo "10. 恢复配置"
echo "0. 退出"
echo ""
read -p "请选择操作: " choice
case $choice in
1)
read -p "接口名: " iface
read -p "IP地址: " ip
read -p "子网掩码: " netmask
read -p "网关(可选): " gateway
configure_static_ip "$iface" "$ip" "$netmask" "$gateway"
;;
2)
read -p "接口名: " iface
configure_dhcp "$iface"
;;
3)
read -p "基础接口: " base_iface
read -p "VLAN ID: " vlan_id
read -p "IP地址: " ip
read -p "子网掩码: " netmask
create_vlan "$base_iface" "$vlan_id" "$ip" "$netmask"
;;
4)
read -p "网桥名: " br_name
echo "输入要添加到网桥的接口(用空格分隔):"
read -p "接口: " interfaces_input
IFS=' ' read -r -a interfaces <<< "$interfaces_input"
create_bridge "$br_name" "${interfaces[@]}"
;;
5)
read -p "绑定接口名: " bond_iface
read -p "绑定模式(1-6): " bond_mode
echo "输入从属接口(用空格分隔):"
read -p "接口: " slaves_input
IFS=' ' read -r -a slaves <<< "$slaves_input"
create_bond "$bond_iface" "$bond_mode" "${slaves[@]}"
;;
6)
read -p "隧道接口名: " tunnel_iface
read -p "本地IP: " local_ip
read -p "远程IP: " remote_ip
read -p "隧道IP: " tunnel_ip
create_tunnel "$tunnel_iface" "$local_ip" "$remote_ip" "$tunnel_ip"
;;
7)
read -p "基础接口: " base_iface
read -p "网络地址(如192.168.1): " network
read -p "起始IP(如100): " start_ip
read -p "别名数量: " count
configure_aliases "$base_iface" "$network" "$start_ip" "$count"
;;
8)
read -p "接口名: " iface
network_diagnostics "$iface"
;;
9)
read -p "接口名: " iface
save_network_config "$iface"
;;
10)
read -p "接口名: " iface
restore_network_config "$iface"
;;
0)
echo "退出"
exit 0
;;
*)
echo "无效选择"
;;
esac
echo ""
read -p "按回车键继续..."
done
}
# 运行主菜单
main_menu
使用ifconfig进行网络故障排查:
#!/bin/bash
# 网络故障排查脚本
LOG_FILE="/var/log/network-troubleshoot.log"
# 记录日志
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# 检查网络接口状态
check_interfaces() {
log "检查网络接口状态..."
echo "=== 网络接口状态 ===" | tee -a "$LOG_FILE"
ifconfig -a | tee -a "$LOG_FILE"
# 检查DOWN状态的接口
local down_ifaces=$(ifconfig -a | grep "flags=" | grep -v "UP" | awk -F: '{print $1}')
if [ -n "$down_ifaces" ]; then
log "发现DOWN状态的接口: $down_ifaces"
for iface in $down_ifaces; do
log "尝试启用接口 $iface..."
sudo ifconfig $iface up
sleep 2
if ifconfig $iface | grep -q "UP"; then
log "接口 $iface 已成功启用"
else
log "警告: 无法启用接口 $iface"
fi
done
fi
}
# 检查IP配置
check_ip_config() {
log "检查IP配置..."
echo "=== IP地址配置 ===" | tee -a "$LOG_FILE"
ifconfig | grep -A 1 "flags" | tee -a "$LOG_FILE"
# 检查是否有IP地址
local interfaces_without_ip=$(ifconfig | awk '/flags/ {iface=$1} /inet / {iface=""} END {if(iface) print iface}')
if [ -n "$interfaces_without_ip" ]; then
log "发现没有IP地址的接口: $interfaces_without_ip"
for iface in $interfaces_without_ip; do
log "尝试为 $iface 配置DHCP..."
sudo dhclient $iface
done
fi
}
# 检查网络连接
check_connectivity() {
log "检查网络连接..."
# 测试本地回环
if ping -c 2 -W 1 127.0.0.1 >/dev/null 2>&1; then
log "✓ 本地回环连接正常"
else
log "✗ 本地回环连接失败"
fi
# 测试网关连接
local gateway=$(route -n | grep "^0.0.0.0" | awk '{print $2}' | head -1)
if [ -n "$gateway" ]; then
if ping -c 2 -W 1 $gateway >/dev/null 2>&1; then
log "✓ 网关 $gateway 连接正常"
else
log "✗ 网关 $gateway 不可达"
fi
fi
# 测试DNS服务器
if grep -q "nameserver" /etc/resolv.conf 2>/dev/null; then
local dns_server=$(grep "nameserver" /etc/resolv.conf | head -1 | awk '{print $2}')
if [ -n "$dns_server" ]; then
if ping -c 2 -W 1 $dns_server >/dev/null 2>&1; then
log "✓ DNS服务器 $dns_server 可达"
# 测试DNS解析
if nslookup google.com $dns_server >/dev/null 2>&1; then
log "✓ DNS解析正常"
else
log "✗ DNS解析失败"
fi
else
log "✗ DNS服务器 $dns_server 不可达"
fi
fi
fi
# 测试外部网络
if ping -c 2 -W 1 8.8.8.8 >/dev/null 2>&1; then
log "✓ 外部网络连接正常 (8.8.8.8)"
else
log "✗ 外部网络连接失败"
fi
}
# 检查路由表
check_routing() {
log "检查路由表..."
echo "=== 路由表 ===" | tee -a "$LOG_FILE"
route -n | tee -a "$LOG_FILE"
# 检查默认路由
if ! route -n | grep -q "^0.0.0.0"; then
log "警告: 没有默认路由"
# 尝试添加默认路由
local gateway=$(ifconfig | grep "inet " | grep -v "127.0.0.1" | awk '{print $2}' | sed 's/\.[0-9]*$/.1/')
if [ -n "$gateway" ]; then
log "尝试添加默认路由: $gateway"
sudo route add default gw $gateway
fi
fi
}
# 检查网络统计信息
check_network_stats() {
log "检查网络统计信息..."
echo "=== 网络接口统计 ===" | tee -a "$LOG_FILE"
ifconfig | grep -A 6 "flags" | grep -E "(RX|TX)" | tee -a "$LOG_FILE"
# 检查错误和丢包
local problematic_ifaces=$(ifconfig | awk '/flags/ {iface=$1} /errors|dropped/ {if($2>0 || $4>0) print iface}')
if [ -n "$problematic_ifaces" ]; then
log "发现有问题接口: $problematic_ifaces"
for iface in $problematic_ifaces; do
log "重置接口 $iface..."
sudo ifconfig $iface down
sleep 1
sudo ifconfig $iface up
done
fi
}
# 检查DNS配置
check_dns() {
log "检查DNS配置..."
echo "=== DNS配置 ===" | tee -a "$LOG_FILE"
cat /etc/resolv.conf 2>/dev/null | tee -a "$LOG_FILE" || echo "无/etc/resolv.conf文件" | tee -a "$LOG_FILE"
}
# 检查网络服务
check_network_services() {
log "检查网络服务..."
# 检查NetworkManager
if systemctl is-active NetworkManager >/dev/null 2>&1; then
log "NetworkManager正在运行"
fi
# 检查network服务
if systemctl is-active network >/dev/null 2>&1; then
log "network服务正在运行"
fi
# 检查systemd-networkd
if systemctl is-active systemd-networkd >/dev/null 2>&1; then
log "systemd-networkd正在运行"
fi
}
# 修复常见网络问题
fix_common_issues() {
log "尝试修复常见网络问题..."
# 1. 刷新ARP缓存
log "刷新ARP缓存..."
sudo ip neigh flush all
# 2. 刷新路由缓存
log "刷新路由缓存..."
sudo ip route flush cache
# 3. 重启网络服务
if systemctl is-active NetworkManager >/dev/null 2>&1; then
log "重启NetworkManager..."
sudo systemctl restart NetworkManager
elif systemctl is-active network >/dev/null 2>&1; then
log "重启network服务..."
sudo systemctl restart network
fi
# 4. 重启网络接口
log "重启网络接口..."
for iface in $(ifconfig -a | grep "flags=" | awk -F: '{print $1}' | grep -v lo); do
log "重启接口 $iface..."
sudo ifconfig $iface down
sleep 1
sudo ifconfig $iface up
done
# 5. 刷新DHCP租约
if command -v dhclient >/dev/null 2>&1; then
log "刷新DHCP租约..."
for iface in $(ifconfig -a | grep "flags=" | grep "UP" | awk -F: '{print $1}' | grep -v lo); do
sudo dhclient -r $iface
sudo dhclient $iface
done
fi
}
# 生成诊断报告
generate_report() {
log "生成网络诊断报告..."
local report_file="/tmp/network-diagnostic-$(date +%Y%m%d-%H%M%S).txt"
{
echo "=== 网络诊断报告 ==="
echo "生成时间: $(date)"
echo "主机名: $(hostname)"
echo ""
echo "1. 系统信息:"
echo "内核版本: $(uname -r)"
echo "发行版: $(cat /etc/os-release 2>/dev/null | grep PRETTY_NAME | cut -d= -f2 | tr -d '\"')"
echo ""
echo "2. 网络接口状态:"
ifconfig -a
echo ""
echo "3. 路由表:"
route -n
echo ""
echo "4. DNS配置:"
cat /etc/resolv.conf 2>/dev/null || echo "无配置"
echo ""
echo "5. 连接测试:"
echo "本地回环: $(ping -c 1 -W 1 127.0.0.1 >/dev/null 2>&1 && echo '正常' || echo '失败')"
echo "外部网络: $(ping -c 1 -W 1 8.8.8.8 >/dev/null 2>&1 && echo '正常' || echo '失败')"
echo "DNS解析: $(nslookup google.com 8.8.8.8 >/dev/null 2>&1 && echo '正常' || echo '失败')"
} > "$report_file"
log "诊断报告已生成: $report_file"
cat "$report_file"
}
# 主函数
main() {
log "=== 开始网络故障排查 ==="
# 检查是否以root运行
if [ "$EUID" -ne 0 ]; then
log "需要root权限运行此脚本"
log "请使用: sudo $0"
exit 1
fi
# 执行检查
check_interfaces
check_ip_config
check_connectivity
check_routing
check_network_stats
check_dns
check_network_services
# 询问是否修复
read -p "是否尝试自动修复网络问题? (y/N): " fix_choice
if [[ $fix_choice =~ ^[Yy]$ ]]; then
fix_common_issues
# 重新检查
log "=== 修复后重新检查 ==="
check_connectivity
fi
# 生成报告
generate_report
log "=== 故障排查完成 ==="
}
# 运行主函数
main
ifconfig到ip命令的迁移指南:
#!/bin/bash
# ifconfig到ip命令迁移指南
# 1. 显示网络接口信息
echo "=== 显示网络接口信息 ==="
echo "ifconfig:"
ifconfig
echo ""
echo "等效的ip命令:"
ip addr show
# 或简写
ip a
# 2. 显示特定接口信息
echo ""
echo "=== 显示特定接口信息 ==="
echo "ifconfig eth0:"
ifconfig eth0
echo ""
echo "等效的ip命令:"
ip addr show dev eth0
# 或
ip a show eth0
# 3. 启用网络接口
echo ""
echo "=== 启用网络接口 ==="
echo "ifconfig eth0 up"
echo "等效的ip命令:"
echo "ip link set eth0 up"
# 4. 禁用网络接口
echo ""
echo "=== 禁用网络接口 ==="
echo "ifconfig eth0 down"
echo "等效的ip命令:"
echo "ip link set eth0 down"
# 5. 配置IP地址
echo ""
echo "=== 配置IP地址 ==="
echo "ifconfig eth0 192.168.1.100"
echo "等效的ip命令:"
echo "ip addr add 192.168.1.100/24 dev eth0"
# 6. 配置IP地址和子网掩码
echo ""
echo "=== 配置IP地址和子网掩码 ==="
echo "ifconfig eth0 192.168.1.100 netmask 255.255.255.0"
echo "等效的ip命令:"
echo "ip addr add 192.168.1.100/24 dev eth0"
# 7. 删除IP地址
echo ""
echo "=== 删除IP地址 ==="
echo "ifconfig eth0 0.0.0.0"
echo "等效的ip命令:"
echo "ip addr del 192.168.1.100/24 dev eth0"
# 8. 设置MAC地址
echo ""
echo "=== 设置MAC地址 ==="
echo "ifconfig eth0 hw ether 00:11:22:33:44:55"
echo "等效的ip命令:"
echo "ip link set dev eth0 address 00:11:22:33:44:55"
# 9. 设置MTU
echo ""
echo "=== 设置MTU ==="
echo "ifconfig eth0 mtu 1500"
echo "等效的ip命令:"
echo "ip link set dev eth0 mtu 1500"
# 10. 显示路由表
echo ""
echo "=== 显示路由表 ==="
echo "route -n"
echo "等效的ip命令:"
echo "ip route show"
# 或简写
echo "ip r"
# 11. 添加默认路由
echo ""
echo "=== 添加默认路由 ==="
echo "route add default gw 192.168.1.1"
echo "等效的ip命令:"
echo "ip route add default via 192.168.1.1"
# 12. 添加静态路由
echo ""
echo "=== 添加静态路由 ==="
echo "route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.1.254"
echo "等效的ip命令:"
echo "ip route add 10.0.0.0/8 via 192.168.1.254"
# 13. 删除路由
echo ""
echo "=== 删除路由 ==="
echo "route del -net 10.0.0.0 netmask 255.0.0.0"
echo "等效的ip命令:"
echo "ip route del 10.0.0.0/8"
# 14. 显示ARP表
echo ""
echo "=== 显示ARP表 ==="
echo "arp -a"
echo "等效的ip命令:"
echo "ip neigh show"
# 15. 添加ARP条目
echo ""
echo "=== 添加ARP条目 ==="
echo "arp -s 192.168.1.100 00:11:22:33:44:55"
echo "等效的ip命令:"
echo "ip neigh add 192.168.1.100 lladdr 00:11:22:33:44:55 dev eth0 nud permanent"
# 16. 删除ARP条目
echo ""
echo "=== 删除ARP条目 ==="
echo "arp -d 192.168.1.100"
echo "等效的ip命令:"
echo "ip neigh del 192.168.1.100 dev eth0"
# 17. 显示网络统计
echo ""
echo "=== 显示网络统计 ==="
echo "netstat -i"
echo "等效的ip命令:"
echo "ip -s link"
# 18. 显示特定接口统计
echo ""
echo "=== 显示特定接口统计 ==="
echo "ifconfig eth0"
echo "等效的ip命令:"
echo "ip -s link show eth0"
# 19. 迁移脚本示例
echo ""
echo "=== 自动迁移脚本示例 ==="
cat > /tmp/ifconfig-to-ip-migration.sh << 'EOF'
#!/bin/bash
# ifconfig到ip命令迁移助手
# 函数:转换ifconfig命令到ip命令
convert_ifconfig_to_ip() {
local ifconfig_cmd="$1"
echo "原ifconfig命令: $ifconfig_cmd"
echo "转换结果:"
case "$ifconfig_cmd" in
# 显示所有接口
"ifconfig"|"ifconfig -a")
echo "ip addr show"
;;
# 显示特定接口
ifconfig\ *)
local iface=$(echo "$ifconfig_cmd" | awk '{print $2}')
echo "ip addr show dev $iface"
;;
# 启用接口
*"ifconfig"*" up"*)
local iface=$(echo "$ifconfig_cmd" | awk '{print $2}')
echo "ip link set $iface up"
;;
# 禁用接口
*"ifconfig"*" down"*)
local iface=$(echo "$ifconfig_cmd" | awk '{print $2}')
echo "ip link set $iface down"
;;
# 配置IP地址
*"ifconfig"*"netmask"*)
local iface=$(echo "$ifconfig_cmd" | awk '{print $2}')
local ip=$(echo "$ifconfig_cmd" | awk '{print $3}')
local netmask=$(echo "$ifconfig_cmd" | awk '{for(i=1;i<=NF;i++) if($i=="netmask") print $(i+1)}')
# 转换子网掩码为CIDR
local cidr=$(ipcalc -b "$ip/$netmask" 2>/dev/null | grep "Netmask:" | awk '{print $2}' | cut -d'/' -f2)
if [ -n "$cidr" ]; then
echo "ip addr add $ip/$cidr dev $iface"
else
echo "# 需要计算CIDR: $ip/$netmask"
fi
;;
# 默认情况
*)
echo "# 无法自动转换,请手动转换"
;;
esac
echo ""
}
# 函数:转换route命令到ip命令
convert_route_to_ip() {
local route_cmd="$1"
echo "原route命令: $route_cmd"
echo "转换结果:"
case "$route_cmd" in
# 显示路由表
"route"|"route -n")
echo "ip route show"
;;
# 添加默认路由
*"route add default gw"*)
local gateway=$(echo "$route_cmd" | awk '{for(i=1;i<=NF;i++) if($i=="gw") print $(i+1)}')
echo "ip route add default via $gateway"
;;
# 添加静态路由
*"route add -net"*)
local network=$(echo "$route_cmd" | awk '{for(i=1;i<=NF;i++) if($i=="-net") print $(i+1)}')
local netmask=$(echo "$route_cmd" | awk '{for(i=1;i<=NF;i++) if($i=="netmask") print $(i+1)}')
local gateway=$(echo "$route_cmd" | awk '{for(i=1;i<=NF;i++) if($i=="gw") print $(i+1)}')
if [ -n "$netmask" ] && [ -n "$gateway" ]; then
# 转换子网掩码为CIDR
local cidr=$(ipcalc -b "$network/$netmask" 2>/dev/null | grep "Netmask:" | awk '{print $2}' | cut -d'/' -f2)
if [ -n "$cidr" ]; then
echo "ip route add $network/$cidr via $gateway"
else
echo "# 需要计算CIDR: $network/$netmask"
fi
fi
;;
# 删除路由
*"route del"*)
echo "# 请使用: ip route del <目标网络>"
;;
# 默认情况
*)
echo "# 无法自动转换,请手动转换"
;;
esac
echo ""
}
# 主菜单
main_menu() {
while true; do
clear
echo "=== ifconfig/route 到 ip 命令转换工具 ==="
echo ""
echo "1. 转换ifconfig命令"
echo "2. 转换route命令"
echo "3. 批量转换脚本"
echo "4. 创建别名"
echo "5. 测试转换"
echo "0. 退出"
echo ""
read -p "请选择: " choice
case $choice in
1)
echo "输入ifconfig命令(如: ifconfig eth0 192.168.1.100 netmask 255.255.255.0):"
read -r ifconfig_cmd
convert_ifconfig_to_ip "$ifconfig_cmd"
;;
2)
echo "输入route命令(如: route add default gw 192.168.1.1):"
read -r route_cmd
convert_route_to_ip "$route_cmd"
;;
3)
echo "=== 批量转换示例 ==="
echo ""
echo "转换常见的ifconfig命令:"
echo "1. ifconfig -> ip addr show"
echo "2. ifconfig eth0 -> ip addr show dev eth0"
echo "3. ifconfig eth0 up -> ip link set eth0 up"
echo "4. ifconfig eth0 192.168.1.100 netmask 255.255.255.0 -> ip addr add 192.168.1.100/24 dev eth0"
echo ""
echo "转换常见的route命令:"
echo "1. route -n -> ip route show"
echo "2. route add default gw 192.168.1.1 -> ip route add default via 192.168.1.1"
echo "3. route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.1.254 -> ip route add 10.0.0.0/8 via 192.168.1.254"
;;
4)
echo "=== 创建命令别名 ==="
echo ""
echo "在 ~/.bashrc 或 ~/.bash_aliases 中添加以下别名:"
echo ""
echo "# ifconfig别名"
echo "alias ifconfig='ip addr show'"
echo "alias ifup='ip link set'"
echo "alias ifdown='ip link set'"
echo ""
echo "# route别名"
echo "alias route='ip route show'"
echo ""
echo "然后运行: source ~/.bashrc"
;;
5)
echo "=== 测试转换 ==="
echo ""
echo "运行以下命令测试:"
echo "1. ip addr show"
echo "2. ip link show"
echo "3. ip route show"
echo "4. ip -s link"
echo "5. ip neigh show"
;;
0)
echo "退出"
exit 0
;;
*)
echo "无效选择"
;;
esac
echo ""
read -p "按回车键继续..."
done
}
# 运行主菜单
main_menu
EOF
# 运行迁移助手
bash /tmp/ifconfig-to-ip-migration.sh
解决方案:
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install net-tools
# RHEL/CentOS
sudo yum install net-tools
# Arch Linux
sudo pacman -S net-tools
# 验证安装
which ifconfig
ifconfig --version
# 显示网络接口
ip addr show
# 或简写
ip a
# 启用接口
ip link set eth0 up
# 禁用接口
ip link set eth0 down
# 配置IP地址
ip addr add 192.168.1.100/24 dev eth0
# 在~/.bashrc中添加别名
echo "alias ifconfig='ip addr show'" >> ~/.bashrc
source ~/.bashrc
# 现在ifconfig会调用ip addr show
ifconfig
# 下载net-tools源码
wget https://sourceforge.net/projects/net-tools/files/net-tools-2.10.tar.xz
tar -xf net-tools-2.10.tar.xz
cd net-tools-2.10
./configure
make
sudo make install
永久保存配置:
# Debian/Ubuntu
sudo nano /etc/network/interfaces
# 添加:
auto eth0
iface eth0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 8.8.8.8 8.8.4.4
# RHEL/CentOS/Fedora
sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0
# 添加:
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
DNS2=8.8.4.4
ONBOOT=yes
# 重启网络
sudo systemctl restart network
# 使用nmcli配置
sudo nmcli connection add type ethernet ifname eth0 \
ip4 192.168.1.100/24 gw4 192.168.1.1
# 或修改现有连接
sudo nmcli connection modify "有线连接 1" \
ipv4.addresses 192.168.1.100/24 \
ipv4.gateway 192.168.1.1 \
ipv4.dns "8.8.8.8 8.8.4.4" \
ipv4.method manual
# 创建systemd服务
sudo nano /etc/systemd/system/network-config.service
# 内容:
[Unit]
Description=Network Configuration
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/configure-network.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
# 创建配置脚本
sudo nano /usr/local/bin/configure-network.sh
# 内容:
#!/bin/bash
ifconfig eth0 192.168.1.100 netmask 255.255.255.0
route add default gw 192.168.1.1
# 启用服务
sudo systemctl enable network-config.service
# 添加@reboot任务
sudo crontab -e
# 添加:
@reboot /usr/local/bin/configure-network.sh
完整迁移步骤:
# 基本命令结构
ip [选项] 对象 命令 [参数]
# 常用对象:
# link - 网络设备
# addr - IP地址
# route - 路由表
# neigh - ARP/NDP缓存
# rule - 策略路由规则
# maddr - 多播地址
# tunnel - IP隧道
# 常用命令:
# show - 显示信息
# add - 添加
# del - 删除
# set - 设置
# 常用命令对照
echo "ifconfig -> ip addr show"
echo "ifconfig eth0 -> ip addr show dev eth0"
echo "ifconfig eth0 up -> ip link set eth0 up"
echo "ifconfig eth0 down -> ip link set eth0 down"
echo "route -n -> ip route show"
echo "arp -a -> ip neigh show"
# 查找使用ifconfig的脚本
grep -r "ifconfig" /etc/ /usr/local/bin/ ~/scripts/ 2>/dev/null
# 替换为ip命令
# 示例替换:
# 原:ifconfig eth0 192.168.1.100
# 新:ip addr add 192.168.1.100/24 dev eth0
# 使用sed批量替换
sed -i 's/ifconfig eth0 \([0-9.]*\) netmask \([0-9.]*\)/ip addr add \1\/\2 dev eth0/g' script.sh
# 在~/.bash_aliases中添加
cat >> ~/.bash_aliases << 'EOF'
# ifconfig别名
alias ifconfig='ip addr show'
alias ifup='ip link set'
alias ifdown='ip link set'
# route别名
alias route='ip route show'
# arp别名
alias arp='ip neigh show'
EOF
source ~/.bash_aliases
# 确认不再需要ifconfig
sudo apt-get remove net-tools
# 或
sudo yum remove net-tools
# 测试所有功能
ip addr show
ip link show
ip route show
ip -s link
ip neigh show
# 验证脚本运行
./your-script.sh