2017-10-23 2 views
0

Ich habe das folgende ExecShellResult Fragment in cfengine v2.2.1a:ExecShellResult nicht wie meine Pfeifen

control: 
    active_interface_mac = (ExecShellResult(/sbin/ifconfig ${active_interface} | /usr/bin/grep 'ether ' | /usr/bin/cut -f2 -d' ')) 
    ... 
    time_drift = (ExecShellResult(/usr/sbin/ntpdate -d pool.ntp.org 2>/dev/null | /usr/bin/grep -o 'offset.*sec' | /usr/bin/cut -f2 -d' ')) 
    ... 
shellcommands: 
    "/bin/echo ${time_drift}" inform=true syslog=true 

Wenn die oben von der Befehlszeile ausgeführt wird, funktioniert es offensichtlich gut:

$ ntpdate ... 
0.183693 

wenn jedoch innerhalb cfengine laufen, bekomme ich einen Syntaxfehler:

$ cfagent -qIK 
Executing script /bin/echo /usr/bin/cut...(timeout=0,uid=-1,gid=-1) 
cfengine:/bin/echo /usr/: /usr/bin/cut 
cfengine: Finished script /bin/echo /usr/bin/cut 
cfengine: 
Executing script /bin/echo option requires an argument -- d usage...(timeout=0,uid=-1,gid=-1) 
cfengine:/bin/echo opti: option requires an argument -- d usage 
cfengine: Finished script /bin/echo option requires an argument -- d usage 
cfengine: 
Executing script /bin/echo cut -b list [-n] [file ...]  cut -c list [file ...]  cut -f list [-s] [-d delim] [file ...]...(timeout=0,uid=-1,gid=-1) 
cfengine:/bin/echo cut : cut -b list [-n] [file ...] cut -c list [file ...] cut -f list [-s] [-d delim] [file ...] 
cfengine: Finished script /bin/echo cut -b list [-n] [file ...]  cut -c list [file ...]  cut -f list [-s] [-d delim] [file ...] 

Hinweis der Fehler bein Wird angezeigt, wenn der Befehl echo unter shellcommands: ausgeführt wird. Bis dahin wurde die ${time_drift} Variable bereits ausgewertet, und das Ergebnis zeigt, dass wir die -d Option falsch aufrufen und uns beschweren, dass wir nichts an -d übergeben haben, was offensichtlich nicht wahr ist.

Dies ist verwirrend, weil ${active_interface_mac} die gleiche Syntax verwendet und perfekt funktioniert.

Ich habe versucht, die zweite grep mit | tail -1 | sed 's///', eine andere grep -o [0-9]*.[0-9] oder irgendetwas anderes, was ich denken konnte, einschließlich /usr/bin/cut -f1 -d'${spc}' ersetzen. Ich kann anscheinend awk nicht benutzen, weil cfengine $(NF) als Klammern interpretiert, die ein Teil von ExecShellResult sind, selbst wenn Escape.

Welche anderen Optionen habe ich, um meinen aktuellen Sekundenwert aus dem Ausgang ntpdate zu extrahieren?

Antwort

0

ich etwa 2 cfengine unsicher bin, sehe ich nicht, was es in Ihrem Beispiel stolpern würde aber für cfengine 3:

bundle agent main 
{ 
    vars: 

    "ntpdate_s" 
     string => execresult("/usr/sbin/ntpdate -d pool.ntp.org 2> /dev/null | /usr/bin/awk '/offset .* sec/ {print $10}'", useshell), 
     if => not(isvariable(offset)); 

    reports: 
    "Mac address of wlan0 $(sys.hardware_mac[wlan0])"; 
    "Offset is $(ntpdate_s)"; 
} 

Ausgang:

R: Mac address of wlan0 5c:e0:c5:9f:f3:8f 
R: Offset is 0.027672