簡體   English   中英

如何在Shell中驗證命令的輸出?

[英]How to verify the output of a command in shell?

我需要驗證特定文件系統是否設置了noexec選項。

例如/dev/shm 我以以下方式運行命令:

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

get_val的值類似於devshm on /dev/shm type devshm (rw,noexec,nosuid,gid=5,mode=0620)

接下來,我要檢查的是gidmode是否已設置為某個值。 但是,通過上述過程,我只能檢查是否設置了選項。

所以我嘗試了這個:

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;}'

但是,這似乎太麻煩了,我不確定哪種方法更好。

也可以在文件系統中設置其他參數,例如nodev等,這會使$ 5或$ 2不同。

有什么建議么?

看起來,即使是進行基本處理,您實際上也應該轉向Awk。

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

(^|,)(,|$)錨點是為了確保匹配項以逗號或字段的開頭/結尾括起來,以避免部分匹配(例如mode=1234 )。

讓Awk設置其返回碼,以便可以在if條件中慣用它,這有點麻煩,但這是一個好主意。

為什么不直接使用[[

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

同樣,對於“ mode = 0620”:

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

如果您喜歡Regex方式:

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

抱歉,這很愚蠢,但不是那么簡單嗎?

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

如果您想檢查多個字段,可以通過如下方式傳遞grep:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM