当我这样做时:
sudo wpa_supplicant -D nl80211,wext -i wlp4s0 -c <(wpa_passphrase "some ssid" "password")
我明白了
Successfully initialized wpa_supplicant
Failed to open config file '/dev/fd/63', error: No such file or directory
Failed to read or parse configuration '/dev/fd/63'
有任何想法吗?
答案1
工艺替代 <(…)
创建一个管道,用于/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 运行 shell 并将进程替换放在那里。如果命令包含特殊字符,请小心引用。
sudo bash -c 'wpa_supplication … -c <(wpa_passphrase …)'
答案2
引用ArchLinux 维基:
注意:由于进程替换,您无法使用 sudo 运行此命令 - 您将需要 root shell。
您应该能够su -c
像sudo
这样使用:
$ sudo su -c 'wpa_supplicant -D nl80211,wext -i wlp4s0 -c \
<(wpa_passphrase "some ssid" "password")'
答案3
对于那些来自网络搜索引擎的用户:请确保您的搜索引擎/dev
已安装。 chroot 时很容易犯的错误,这可能会导致诸如此类的错误。