Quá trình thay thế <(…)
tạo ra một đường ống, sử dụng /dev/fd
để đưa ra một đường dẫn tương đương với bộ mô tả tệp có đường ống và chuyển tên tệp làm đối số cho chương trình. Đây là chương trình sudo
, và nó chuyển đối số đó (chỉ là một chuỗi, theo như nó liên quan) wpa_supplicant
, coi nó như một tên tệp.
Vấn đề là sudo đóng tất cả các mô tả tệp ngoại trừ các tiêu chuẩn (stdin = 0, stdout = 1 và stderr = 2). Đường ống của sự thay thế quá trình nằm trên một mô tả khác, được đóng lại, vì vậy khi wpa_supplicant
cố gắng mở nó, nó sẽ tìm thấy một tệp không tồn tại.
Nếu chính sách sudo của bạn cho phép nó ( closefrom_override
tùy chọn được bật), bạn có thể yêu cầu nó không đóng mô tả tệp. Nhưng điều này thường không phải là trường hợp.
sudo -C 64 wpa_supplicant … -c <(wpa_passphrase …)
Ngoài ra, vì bạn không sử dụng đầu vào tiêu chuẩn, hãy chuyển dữ liệu ở đó.
wpa_passphrase … | sudo wpa_supplicant … -c /dev/stdin
Hoặc, chạy shell từ sudo và đặt quá trình thay thế ở đó. Hãy cẩn thận với trích dẫn nếu lệnh chứa các ký tự đặc biệt.
sudo bash -c 'wpa_supplication … -c <(wpa_passphrase …)'