2016-09-13 87 views
1

我有一个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用户运行,因此它具有扫描整个网络所需的所有高程。

+0

你是否用'sudo'试过了你的脚本,看它是否是有影响力的cron或root用户? –

+0

我实际上是从sudo cron和普通cron运行脚本,它们都产生相同的错误输出。我使用sudo和常规模式手动运行我的脚本,它们产生相同的正确输出。 – carrots

+0

检查环境变量差异。我会'grep -Eo'192 \ .168 \ .0 \。{1,3 \} [0-9]''(引用) –

回答

1

首先,有在你的grep正则表达式几个问题:

  1. 的重复计数({1,3})适用于它的前面的原子(即,“.”),而不是在下一个(即'[0-9]')。
  2. 正则表达式中的非转义点('.')与任何隐藏前一个错误的字符匹配。您正则表达式(192.168.0.{1,3}[0-9])匹配192.168.0.123如下:

    192.168.0 matches 192.168.0 
    .{1,3} matches .12 
    [0-9]  matches 3 
    

    但它也将匹配下列字符串:

    192116810abc1 
    192.681.012.9 
    

正确的正则表达式必须192\.168\.0\.[0-9]{1,3},它必须被引用,从而使bash通过它grep字面上:

grep -Eo '192\.168\.0\.[0-9]{1,3}' 

然而,错误reg ex很难解释你用cron看到的问题。

一个问题可能是您的临时文件使用固定名称new.txt。如果您在其他脚本中执行相同操作,或者如果将此cron作业设置为每分钟运行一次,而完成扫描网络需要一分钟以上的时间,则new.txt可能会在错误的时间被覆盖。

请解决您的脚本如下,看看问题是否会消失:

#!/bin/bash 

tmpfile="$(mktemp)" 
trap "rm $tmpfile" EXIT 
nmap -sn 192.168.0.1-255 | grep -Eo '192\.168\.0\.[0-9]{1,3}' > "$tmpfile" 
date >> network_log 
echo ---------------------------- >> network_log 
cat "$tmpfile" >> network_log 
+0

感谢您提供了所有这些建议,我从来没有意识到tmpfile的事情会更好,特别是因为nmap的确需要运行时间相对较长。 &thankyou正则表达式更正 – carrots

1

你的脚本缺少家当,所以它可能会依赖于一个crontab或手动启动不同的shell中运行。

添加以下内容作为第一行脚本(如果需要的话您的当前用户shell替换的bash):

#!/usr/bin/env bash 

不要使用/ bin/bash的,因为它是在/ usr/bin中携带以下/ env bash。

此外,crontab运行将不会有PATH变量。 打印PATH变量有:

echo $PATH 

并将其添加为喜欢你的脚本的第二行:

#!/usr/bin/env bash 
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin 

这应该确保你的脚本在同一环境中时的crontab或手动运行运行。

+0

感谢您的支持!它现在可以工作了,你可以给我一个链接或者扩展为什么/ bin/bash不如/ usr/bin/env bash – carrots

+0

/bin/bash是linux特有的,而/ usr/bin/env应该存在于所有unix系统。请参阅http://stackoverflow.com/questions/16365130/the-difference-between-usr-bin-env-bash-and-usr-bin-bash。 – deajan