İşlem ikamesi <(…)
bir kanal oluşturur, kanalın /dev/fd
bulunduğu dosya tanımlayıcıya eşdeğer bir yol vermek için kullanır ve dosya adını bir bağımsız değişken olarak programa iletir. İşte program sudo
, ve bu argümanı (ilgili olduğu kadarıyla sadece bir dize) wpa_supplicant
, dosya adı olarak ele alıyor.
Sorun şu ki sudo, standart dosyalar hariç tüm dosya tanımlayıcılarını kapatır (stdin = 0, stdout = 1 ve stderr = 2). Süreç ikamesinin borusu, kapanan başka bir tanımlayıcıdadır, bu yüzden wpa_supplicant
açmaya çalıştığında, var olmayan bir dosya bulur.
Sudo politikanız buna izin veriyorsa ( closefrom_override
seçenek etkin), dosya tanımlayıcılarını kapatmamasını söyleyebilirsiniz. Ancak bu genellikle böyle değildir.
sudo -C 64 wpa_supplicant … -c <(wpa_passphrase …)
Alternatif olarak, standart girdi kullanmadığınızdan, verileri oradan geçirin.
wpa_passphrase … | sudo wpa_supplicant … -c /dev/stdin
Alternatif olarak, sudo'dan bir kabuk çalıştırın ve işlem ikamesini oraya koyun. Komut özel karakterler içeriyorsa alıntı yapmaya dikkat edin.
sudo bash -c 'wpa_supplication … -c <(wpa_passphrase …)'