Shell-Script

通過 crontab 執行時,arp 不在腳本中執行

  • October 22, 2021

我有一個特定的腳本來獲取特定的IP地址MAC。為此,它使用arp,並且可以正常工作。當我編寫 acrontab來執行該腳本時,問題就來了;它工作正常並且可以執行,但是它執行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

使用 STDOUT OF COMMANDS 更新 我已將 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:

PATH與普通互動式環境相比,cron 執行腳本的環境具有不同的變數值。

這意味著您的腳本不知道在哪裡arp可以找到命令,例如(如註釋中所述)。

我建議您通過command -v在互動式外殼中為每個工具執行來記錄您在腳本中使用的工具的目錄,例如

command -v nmap
command -v arp

等等

這將為您提供這些命令的路徑名列表。獲取這些目錄名稱並將它們添加到PATH腳本本身(在腳本開頭的某個位置):

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

在腳本中執行此操作可確保腳本可以找到該工具。

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

PATH=$PATH:/usr/sbin

另一種選擇是使用具有絕對路徑的工具,例如使用/usr/sbin/arp而不是arp.

引用自:https://unix.stackexchange.com/questions/583516