bash - crontab 和手动运行脚本之间的不同结果

标签 bash cron network-programming nmap

我有一个执行此操作的 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/

相关文章:

linux - 归档旧目录并删除它们

firebase - Firestore使用云功能自动备份?

java - 一次从多个套接字接收数据(多线程)

linux - 从 bash 脚本中发送到后台的进程中检索退出代码

linux - 为什么lxterminal无法识别树莓派3中的键盘命令?

linux - 安排许多 cron 作业每 5 分钟运行一次,但不是同时运行

php - Godaddy cron 作业只发送一封电子邮件

c++ - 来自 TCP/IP 堆栈的网络传输时间

c# - 将 Ping 应用程序转换为多线程版本以提高速度 - C#

bash - 在 bash 脚本中模拟用户输入