2016-06-22 7 views
0

Ich muss überprüfen, ob ein bestimmtes Dateisystem die noexec Option festgelegt hat.Wie überprüft man die Ausgabe eines Befehls in der Shell?

Zum Beispiel /dev/shm. Ich verwende den Befehl auf die folgende Weise:

get_val=$(mount|grep /dev/shm) 
if [[ -z get_val ]] ; then 
    # Error 
else 
    value=$(echo "${get_val}" | cut -d " " -f 6 | grep noexec) 
    if [ "${value}" = "" ]; then 
    # Not set 
    else 
    # Set 
    fi 
fi 

Der Wert get_val etwas wie devshm on /dev/shm type devshm (rw,noexec,nosuid,gid=5,mode=0620)

Weiter ist es, was ich tun möchte, ist zu überprüfen, ob gid und mode auf einen bestimmten Wert eingestellt. Mit dem obigen Verfahren kann ich jedoch nur prüfen, ob eine Option eingestellt ist.

So habe ich versucht, dies:

echo "${get_val}"| cut -d " " -f 6 | awk -F, '{ 
if ($4 == "gid=123"){ 
print 1; 
} 
else 
{ print 0;} 
if ($5 == "mode=123)"){ 
print 1; 
} 
else 
{ print 0;}' 

Dies scheint jedoch zu stress ish und ich bin nicht sicher, was der bessere Weg sein wird, dies zu tun.

Auch andere Parameter könnten in einem Dateisystem wie nodev etc gesetzt werden, was $ 5 oder $ 2 anders machen würde.

irgendwelche Vorschläge?

+0

http: // stackoverflow.com/questions/1891797/capturing-groups-from-a-grep-regex – xxfelixxx

+1

Sie können dies mit mehreren GREPS IMHO beenden. – sjsam

Antwort

1

Sieht aus wie Sie sollten wirklich zu Awk auch für die grundlegende Verarbeitung wenden.

if mount | awk '$1 == "/dev/shm" && $6 ~ /(^|,)noexec(,|$)/ && 
    $6 ~ /(^|,)gid=123(,|$)/ && $6 ~ /(^|,)mode=123(,|$)/ { exit 0 } 
    END { exit 1 }' 
then 
    echo fine 
else 
    echo fail 
fi 

Die (^|,) und (,|$) Anker sind um sicherzustellen, dass die Spiele eingeklammert werden entweder durch Kommas oder Anfang/Ende des Feldes, teilweise Übereinstimmungen zu vermeiden (wie mode=1234).

Awk, seinen Rückkehrcode zu setzen, so dass es idiomatisch in einem if Zustand verwendet werden kann, ist ein bisschen eine Hektik, aber eine gute allgemeine Idee zu lernen.

+0

'/dev/shm' ist möglicherweise nicht das erste Argument in der Zeile ausgeben, wie Sie in der Beispielausgabe sehen können, die ich – CoderBC

+0

Right zur Verfügung gestellt habe - konvertieren zu einem Regex dann, oder prüfen '$ 3' statt' ' $ 1, wenn es immer das dritte Feld ist. – tripleee

0

Warum nicht direkt verwenden Globbing mit [[:

[[ ${get_val} == *\(*gid=5*\)* ]] && echo 'Matched' 

In ähnlicher Weise mit "mode = 0620":

[[ ${get_val} == *\(*mode=0620*\)* ]] && echo 'Matched' 

Wenn Sie es vorziehen Regex Weg:

[[ ${get_val} =~ \(.*gid=5.*\) ]] && echo 'Matched' 
[[ ${get_val} =~ \(.*mode=0620.*\) ]] && echo 'Matched' 
+0

Hier gibt es einen Haken: Wenn der Mountpoint-Pfad 'gid = 5' enthält (sagen wir '/ tmp/gid = 5' oder dumm'/dev/shm-wer-benutzt-so-seltsame Namen-gid = 5') Diese Regex stimmen überein und geben falsche Ergebnisse. Also, wir sollten die Teilzeichenfolge '$ get_val' anpassen, um nur den Optionsteil des Ergebnisses zu entsprechen ... – anishsane

+0

@anishsane Fixed .. – heemayl

+0

Nein, jetzt wird' Matched' zurückgegeben, auch wenn es keine Übereinstimmung in der Zeile gibt . z.B.Versuche es mit 'get_val = 'devshm on/dev/shm type devshm (rw, noexec, nosuid, gid = 5)' '' [[$ {get_val} == * (* modus = 0620 *) *]] && echo' Matched'' – anishsane

0

Sorry, wenn dies ist dumm, aber ist es nicht so einfach, wie

mount | grep -E '^/dev/shm.*noexec' && value=1 
((value)) && #Do something useful 

Wenn Sie mehrere Felder überprüfen wist Sie können über die Pipeline die grep wie unten:

mount | grep -E '^/dev/shm.*noexec' \ 
| grep -E 'gid=5.*mode=0620|mode=0620.*gid=5' >/dev/null && value=1 

((value==1)) && #Do something useful 
+0

Es beantwortet den Anfang der Frage, aber wenn Sie den Rest lesen, sieht es aus wie das OP möglicherweise möchte diese anderen Felder auch validieren – tripleee

+1

@tripleee: Warum nicht mehrere Greps verwenden, wie ich in der Bearbeitung gezeigt habe? –

+0

Mehrere Greps sind ein Antipattern. Du scheinst auch nach Awk zu greifen. – tripleee

Verwandte Themen