通过 crontab 运行时 arp 不在脚本中运行

通过 crontab 运行时 arp 不在脚本中运行

我有一个特定的脚本来获取IP特定的地址MAC。为此,它使用arp,并且工作正常。当我编写 a 程序crontab来运行该脚本时,问题就出现了;它工作正常并运行,但运行arp命令的行不起作用,因此仅当脚本从 运行时才能正确完成crontab

脚本是:

#!/bin/bash

subred=192.168.1.0/24
mac=aa:bb:cc:dd:ff:gg

log() {...}

log info "Init program"
ip=$(nmap -sP $subred >/dev/null && arp -an | grep $mac | awk '{print $2}' | sed 's/[()]//g')

if [  $ip  ]; then
    log ok "IP found in $ip"
else
    log error "IP not found"
fi

log info "Finished program"

该脚本已配置为crontab每小时运行一次@hourly /root/machaunter.sh。时间安排cron做得很好,脚本运行顺利,排除了权限或脚本问题。它们的证明是它生成的日志文件:

29/04/2020 14:00:01 Init program
29/04/2020 14:00:06 IP not found
29/04/2020 14:45:59 Init program
29/04/2020 14:46:08 IP found in 192.168.1.173
29/04/2020 14:46:09 Finished program
29/04/2020 15:00:01 Init program
29/04/2020 15:00:10 IP not found
29/04/2020 16:00:01 Init program
29/04/2020 16:00:13 IP not found
29/04/2020 17:00:01 Init program
29/04/2020 17:00:07 IP not found
29/04/2020 18:00:01 Init program
29/04/2020 18:00:05 IP not found
29/04/2020 18:25:43 Init program
29/04/2020 18:25:50 IP found in 192.168.1.173
29/04/2020 18:25:51 Finished program

正如您所看到的,按小时计算,我手动运行脚本的两次工作正常,但其余时间则不然。

我一直在调试并添加到脚本测试中,直到我发现,在调用中arp没有显示任何内容,但是当我手动启动它时它会显示(为了进行测试,我添加了日志log error "arp: $(arp -an)"并将 crontab 更改为每分钟运行一次* * * * /root/machaunter.sh

30/04/2020 09:22:01 Init program
30/04/2020 09:22:01 arp:
30/04/2020 09:23:01 Init program
30/04/2020 09:23:01 arp:
30/04/2020 09:24:02 Init program
30/04/2020 09:24:02 arp:
30/04/2020 09:24:29 Init program
30/04/2020 09:24:29 arp: Address HWtype HWaddress Flags Mask Iface 192.168.1.46 ether 7e:2d:d1:ca:d9:c0 C br0 192.168.1.68 ether c894:66:dd:1c:c2:9d C br0 192.168.1.173 ether 48:48:59:e5:b8:5e C br0 192.168.1.1 ether bf:f1:54:4d:e3:25 C br0
30/04/2020 09:25:01 Init program
30/04/2020 09:25:01 arp:
30/04/2020 09:26:01 Init program
30/04/2020 09:26:01 arp:
30/04/2020 09:27:01 Init program
30/04/2020 09:27:01 arp:
30/04/2020 09:28:01 Init program
30/04/2020 09:28:01 arp:
30/04/2020 09:29:02 Init program
30/04/2020 09:29:02 arp:
30/04/2020 09:30:01 Init program
30/04/2020 09:30:01 arp:
30/04/2020 09:31:01 Init program
30/04/2020 09:31:01 arp:

从日志中可以看出,arp除了我手动启动它的唯一一次之外,该命令从不返回数据。另外,正如您所看到的,调用此命令时不会终止脚本(我们没有日志Finished program

为什么会发生这种情况?会有什么解决办法呢?

使用 CRON 守护进程日志更新

● cron.service - Regular background program processing daemon
   Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2020-04-27 18:09:19 UTC; 2 days ago
     Docs: man:cron(8)
 Main PID: 486 (cron)
   CGroup: /system.slice/cron.service
           └─486 /usr/sbin/cron -f

Apr 30 10:40:01 NanoPi-R1 CRON[14428]: (root) CMD (/root/machaunter.sh)
Apr 30 10:40:01 NanoPi-R1 CRON[14429]: (root) CMD (   /bin/bash /usr/bin/sync_ntp_rtc.sh /dev/rtc0)
Apr 30 10:40:01 NanoPi-R1 CRON[14421]: (CRON) info (No MTA installed, discarding output)
Apr 30 10:40:01 NanoPi-R1 CRON[14421]: pam_unix(cron:session): session closed for user root
Apr 30 10:40:04 NanoPi-R1 CRON[14420]: (CRON) info (No MTA installed, discarding output)
Apr 30 10:40:04 NanoPi-R1 CRON[14420]: pam_unix(cron:session): session closed for user root
Apr 30 10:41:01 NanoPi-R1 CRON[14459]: pam_unix(cron:session): session opened for user root by (uid=0)
Apr 30 10:41:01 NanoPi-R1 CRON[14463]: (root) CMD (/root/machaunter.sh)
Apr 30 10:41:01 NanoPi-R1 CRON[14459]: (CRON) info (No MTA installed, discarding output)
Apr 30 10:41:01 NanoPi-R1 CRON[14459]: pam_unix(cron:session): session closed for user root

使用命令标准输出更新 我已将 XXXX 重定向添加到 crontab 命令>/tmp/logfile 2>&1,滞后:

* * * * * /root/machaunter.sh >/tmp/logfile 2>&1

/tmp/logfile我得到:

30/04/2020 13:52:01 [info] Init program
/root/machaunter.sh: line 37: arp: command not found
30/04/2020 13:52:01 [info] arp:

答案1

PATH与普通的交互式环境相比,cron 运行脚本的环境具有不同的变量值。

这意味着您的脚本不知道在哪里arp可以找到该命令,例如(正如评论中提到的)。

我建议您通过command -v在交互式 shell 中运行每个工具来记下您在脚本中使用的工具的目录,例如

command -v nmap
command -v arp

ETC。

这将为您提供这些命令的路径名列表。获取这些目录名称并将它们添加到PATH脚本本身中(在脚本开头的某个位置):

PATH=$PATH:/some/directory/path:/another/directory/path

在脚本中执行此操作可保证脚本能够找到该工具。

最后,您可能只需要添加/usr/sbin

PATH=$PATH:/usr/sbin

另一种选择是使用工具及其绝对路径,例如使用/usr/sbin/arp而不只是arp.

答案2

arp在 中运行脚本crontab,需要使用arp路径 as/sbin/arp而不是arp,因为crontab运行脚本/bin默认位于 中,而 whilearp位于 中/sbin/

相关内容