Answers:
注意:由于存在进程替换,因此无法使用sudo运行此命令-您将需要root shell。
你应该能够使用su -c
在sudo
像这样:
$ sudo su -c 'wpa_supplicant -D nl80211,wext -i wlp4s0 -c \
<(wpa_passphrase "some ssid" "password")'
进程替换 <(…)
创建一个管道,用于/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 …)'
对于来自网络搜索引擎的用户:确保/dev
已安装。chroot时容易犯的一个错误,然后可能导致诸如此类的错误。