$ sudo arp -avn
? (10.10.7.30) at 00:cc:cc:bb:dd:86 [ether] on eth0
...
$ sudo arp --delete 10.10.7.30
$ sudo arp -avn
? (10.10.7.30) at <incomplete> [ether] on eth0
我以为--delete
不会有 的条目10.10.7.30
。出乎意料的是,该条目仍然存在,并被标记为<incomplete>
。
使用Ubuntu 10.04。
答案1
该条目将被删除,请耐心等待。
(如果你想要最简短的答案:不完整==已删除)
假设“删除”不是该操作的错误用词。实际发生的情况是,该条目被手动设置为状态“请求已发送,尚无答复”(因此 ARP 过程“不完整”)就好像该机器真的无法访问一样。
现在,除非在此期间收到新的有效 ARP 响应,否则该条目将很快被完全删除。在这种情况下,即使条目被删除,它仍会被重新添加,而不是被标记为不完整。所以这种行为实际上没有好处或坏处。
但请记住,我们谈论的是缓存。从缓存中删除内容既困难又昂贵。使条目无效并等待其被替换后再最终删除,这种方式效率更高。但对于系统而言,条目从列表中消失或只是标记为不完整完全没有区别。
答案2
答案3
除了其他不错的答案之外,值得一提的是,可以通过删除 arp 缓存来彻底消除它。其中一种不太麻烦的方法是:
ip link set arp off dev eth0 ; ip link set arp on dev eth0
这应该删除所有条目,无论它们处于何种状态。
替代方法包括关闭和启动接口以及类似方法,以完全删除和重新创建 arp 缓存。
答案4
我知道这听起来很明显,但是对于那些不习惯使用 shell 的人来说,这是我的建议:
从@KarmaFusebox 的回答开始,为什么不简单地grep 结果...? :
arp -a | grep "incomplet" -i -v
它只会显示现有/活动的缓存条目。
我认为它一直是符合 POSIX 标准命令。这是可编写脚本方法,如果这是您所需要的。