नया -C
विकल्प संतोषजनक नहीं है, क्योंकि यह समय-समय पर चेक-टू-टाइम-ऑफ़-यूज़ (TOCTTOU) दौड़ की स्थिति के लिए खुला है। यदि दो प्रक्रियाएँ एक ही समय में एक ही नियम को जोड़ने का प्रयास करती हैं, -C
तो उन्हें दो बार जोड़ने से नहीं बचाएगी।
तो, यह वास्तव में grep
समाधान से बेहतर नहीं है । आउटपुट पर एक सटीक टेक्स्ट प्रोसेसिंग जॉब के iptables-save
रूप में मज़बूती से काम कर सकता है -C
, क्योंकि यह आउटपुट तालिकाओं की स्थिति का एक विश्वसनीय स्नैपशॉट है।
जरूरत है एक --ensure
विकल्प की जो परमाणु जांच करता है और एक नियम जोड़ता है केवल अगर यह पहले से मौजूद नहीं है। इसके अलावा, यह अच्छा होगा यदि नियम को सही स्थिति में ले जाया जाए जहां एक नया नियम डाला जाएगा यदि यह पहले से मौजूद नहीं है ( --ensure-move
)। उदाहरण के लिए यदि iptables -I 1
किसी श्रृंखला के प्रमुख पर एक नियम बनाने के लिए उपयोग किया जाता है, लेकिन वह नियम पहले से ही सातवें स्थान पर मौजूद है, तो मौजूदा नियम को पहले स्थान पर जाना चाहिए।
इन विशेषताओं के बिना, मुझे लगता है कि इस छद्म कोड के आधार पर एक शेल स्क्रिप्ट लूप लिखना संभव है।
while true ; do
# delete all copies of the rule first
while copies_of_rule_exist ; do
iptables -D $RULE
done
# now try to add the rule
iptables -A $RULE # or -I
# At this point there may be duplicates due to races.
# Bail out of loop if there is exactly one, otherwise
# start again.
if exactly_one_copy_of_rule_exists ; then
break;
fi
done
यह कोड घूम सकता है; यह गारंटी नहीं देता कि दो या अधिक रेसर निश्चित संख्या में पुनरावृत्तियों से बाहर होंगे। इसके साथ मदद करने के लिए कुछ यादृच्छिक घातीय बैकऑफ स्लीप जोड़े जा सकते हैं।