2016-09-13 83 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