前言
远程唤醒主机有多种方法,如果想通过命令方式,则方便放在计划任务中执行。
一、shell脚本
[root@pg1 ~]# echo -e $(echo $(printf 'f%.0s' {1..12}; printf "$(echo 54-E1-AD-83-1A-E6 | sed 's/-//g')%.0s" {1..16}) | sed -e 's/../\\x&/g') | nc -w1 -u 255.255.255.255 2301
二、先决条件
需要安装nc
yum install -y nc
如果没有网络可下载依赖包安装,地址如下
http://mirror.centos.org/centos/7/os/x86_64/Packages/
依赖包如下,下载后安装
[root@pg1 ~]# rpm -i libpcap-1.5.3-12.el7.x86_64.rpm
[root@pg1 ~]# rpm -i nmap-ncat-6.40-19.el7.x86_64.rpm
三、命令解释
魔术包
WOL魔术包是有12个F跟随16个重复的mac地址不含‘:’或‘-’符号构成。如果mac地址是这样
54-E1-AD-83-1A-E6
则魔术包类似这样
ffffffffffff54E1AD831AE654E1AD831AE654E1AD831AE654E1AD831AE654E1AD831AE654E1AD831AE654E1AD831AE654E1AD831AE654E1AD831AE654E1AD831AE654E1AD831AE654E1AD831AE654E1AD831AE654E1AD831AE654E1AD831AE654E1AD831AE6
格式化输出
1. printf 'f%.0s':这是 printf 命令的格式字符串。
• 'f':表示直接输出字符 'f'。
• %.0s:是一个格式化字符串,用于处理后续的参数。%s 通常用于输出字符串,但这里的 .0 意味着不输出任何字符(即,字符串的长度为0)。
2. {1..12}:这是一个 Bash shell 中的序列扩展。它会被扩展为从1到12的一系列数字,即 1 2 3 4 5 6 7 8 9 10 11 12。
当你运行 printf 'f%.0s' {1..12},printf 会对每一个由 {1..12} 生成的数字执行一次。但由于 %.0s 的存在,这些数字实际上不会被输出。因此,该命令的实际输出是:
fffffffffffff
即,连续输出了12个 'f' 字符。
sed命令
sed命令用来把mac地址中的符号“-”去除。添加\x十六进制区分符,因此ff变成\xff,54变成\x54,上面包转后后是这样
\xff\xff\xff\xff\xff\xff\x54\xE1\xAD\x83\x1A\xE6\x54\xE1\xAD\x83\x1A\xE6\x54\xE1\xAD\x83\x1A\xE6\x54\xE1\xAD\x83\x1A\xE6\x54\xE1\xAD\x83\x1A\xE6\x54\xE1\xAD\x83\x1A\xE6\x54\xE1\xAD\x83\x1A\xE6\x54\xE1\xAD\x83\x1A\xE6\x54\xE1\xAD\x83\x1A\xE6\x54\xE1\xAD\x83\x1A\xE6\x54\xE1\xAD\x83\x1A\xE6\x54\xE1\xAD\x83\x1A\xE6\x54\xE1\xAD\x83\x1A\xE6\x54\xE1\xAD\x83\x1A\xE6\x54\xE1\xAD\x83\x1A\xE6\x54\xE1\xAD\x83\x1A\xE6
发送
然后通过nc命令发送出去
-w1:设置连接的等待时间为1秒。如果在1秒内没有收到数据或连接没有建立,则命令会退出。
-u:使用UDP协议。默认情况下,nc使用TCP协议,但使用-u选项会使其使用UDP。
255.255.255.255:目标IP地址。这是一个特殊的广播地址,它意味着数据包会被发送到该网络上的所有设备。
2301:目标端口号。这个可有可无。
其他说明:
echo -e 是一个在 Unix 和类 Unix 系统(如 Linux)中常用的 echo 命令的选项,它允许对转义字符进行解释。
在 echo 命令中使用 -e 选项时,你可以使用特定的转义序列来生成特殊字符或控制文本输出格式。
$() 是一种命令替换的语法,它允许你将一个命令的输出替换为变量或脚本中的另一个位置。$() 内的命令会先执行,然后将其标准输出替换到脚本中的当前位置。
这与反引号(`command`)的功能相同,但 $() 的语法在视觉上更加清晰,并且在嵌套时更容易管理。