प्रक्रिया प्रतिस्थापन <(…)
एक पाइप बनाता है, /dev/fd
एक पथ देने के लिए उपयोग करता है जो फ़ाइल डिस्क्रिप्टर के समान है जहां पाइप है, और प्रोग्राम में एक तर्क के रूप में फ़ाइल नाम पास करता है। यहाँ कार्यक्रम है sudo
, और यह उस तर्क को पारित करता है (जो सिर्फ एक स्ट्रिंग है, जहां तक यह चिंतित है) wpa_supplicant
, जो इसे एक फ़ाइल नाम के रूप में मानता है।
समस्या यह है कि sudo मानक वाले (stdin = 0, stdout = 1 और stderr = 2) को छोड़कर सभी फ़ाइल डिस्क्रिप्टर को बंद कर देता है। प्रक्रिया प्रतिस्थापन का पाइप दूसरे विवरणक पर होता है, जो बंद हो जाता है, इसलिए जब wpa_supplicant
इसे खोलने की कोशिश की जाती है, तो यह एक ऐसी फ़ाइल पाता है जो मौजूद नहीं है।
यदि आपकी sudo नीति इसे अनुमति देती है ( closefrom_override
विकल्प सक्षम), तो आप इसे फाइल डिस्क्रिप्टर को बंद नहीं करने के लिए कह सकते हैं। लेकिन आमतौर पर ऐसा नहीं होता है।
sudo -C 64 wpa_supplicant … -c <(wpa_passphrase …)
वैकल्पिक रूप से, चूंकि आप मानक इनपुट का उपयोग नहीं कर रहे हैं, इसलिए वहां डेटा पास करें।
wpa_passphrase … | sudo wpa_supplicant … -c /dev/stdin
वैकल्पिक रूप से, सुडो से एक शेल चलाएं और वहां प्रक्रिया प्रतिस्थापन डालें। यदि कमांड में विशेष वर्ण हैं, तो उद्धरण के साथ ध्यान रखें।
sudo bash -c 'wpa_supplication … -c <(wpa_passphrase …)'