我有一个执行此操作的 bash 脚本:
nmap -sn 192.168.0.1-255 | grep -Eo 192.168.0.{1,3\}[0-9] > new.txt
date >> network_log
echo ---------------------------- >> network_log
cat new.txt >> network_log
扫描网络,并将结果附加到带有时间戳的文件 network_log 中。 手动运行后,network_log 文件如下所示:
Tue 13 Sep 2016 11:22:23 EDT
----------------------------
192.168.0.1
192.168.0.2
192.168.0.45
而 cronjobs 在我的 network_log 文件中产生以下输出:
Tue Sep 13 17:46:00 EDT 2016
----------------------------
没有 ip 结果。 注意:cronjob 是从 root 用户运行的,因此它具有扫描整个网络所需的所有提升。
最佳答案
您的脚本缺少 shebang,因此它可能会使用不同的 shell 运行,具体取决于 crontab 或手动启动。
在脚本的第一行添加以下内容(如果需要,将 bash 替换为您当前的用户 shell):
#!/usr/bin/env bash
不要使用/bin/bash,因为它的可移植性不如/usr/bin/env bash。
此外,crontab 运行不会有 PATH 变量。 打印你的路径变量:
echo $PATH
并将其添加为脚本的第二行,例如:
#!/usr/bin/env bash
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin
这应该确保您的脚本在通过 crontab 或手动运行时在相同的环境中运行。
关于bash - crontab 和手动运行脚本之间的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39479570/