即使这是一个网络问题,我也会说这是一个 Unix/Linux 经验丰富的用户问题。
我在尝试着手动发送网络魔术包通过使用回声和重定向器(文件描述符)。
这是一例子必须通过网络广播发送的数据(至 255.255.255.255)以唤醒计算机MAC 00:17:31:3F:D3:A9(FFFFFFFFFFFF 后跟 MAC 的 16 倍,不带冒号):
ffffffffffff0017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a9
我已经从我常用的程序中发送了 LAN 唤醒魔术包(IH沃尔,或者wakeonlan
Linux 的工具)工作得很好,我被捕获WireShark 的网络流量:
注意突出显示的绿色区域:魔法包是正确地以十六进制发送。
现在是时候了重定向器回显方法。
我正在回显魔法数据包以广播IP地址、UDP协议、端口号4000:
exec 6<>/dev/udp/255.255.255.255/4000
echo "ffffffffffff0017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a9" >&6
没有结果(远程计算机无法唤醒)。 WireShark的抓包是这次咯不同的:
binary area
可以看到,魔法包现在位于信息的右侧(!) 。在左侧区域,每个F
显示为66
(我假设是其 ASCII 代码),每个0
显示为30
...等。
顺便说一下,WireShark 不会将数据检测为“MagicPacket”。
是什么正确的发送方式我的数据可以通过shell直接传到网卡吗?
PS:也许这个问题必须转移到ServerFault?我认为这很像某种十六进制到 ascii 或二进制转换问题。
答案1
真的很简单:
- 添加十六进制规范“\x”每两个字符。
- 用于
echo -e
十六进制解释的。您也可以使用,printf
因为echo
在不同的 shell 中执行不同的操作。
使用相同的示例数据:
echo -e "\xff\xff\xff\xff\xff\xff\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9" >&6
这次您的计算机应该被唤醒。
- 笔记: 不是所有的shell都这样支持此功能。事实上,只有少数人这样做。参考这个线程知道是哪一个做的。为我,西格文最新版本(2015年6月)Windows运行
Bash 4.3.39(2)-release (i686-pc-cygwin)
完美。 - 笔记2:遗憾的是,Ubuntu (v14.04) 和 Kali (v1.1.0) 似乎不支持就今天而言,正如中所解释的这个线程。由于网络兼容性问题,它可能已在 Bash 上被禁用。
- 注3:嗯,我必须承认,报告这
/dev/protocol/host/port
不是正确方法的人(参见上面的线程)是完全正确的。例如,十六进制代码\x0a
充当网络数据报的一些控制代码,分割数据包。所以你不能像0a:11:22:33:44:55
这种方法那样使用MAC地址。是时候切换到netcat
或socat
。