我正在尝试使用 bash 脚本连接到 WPA2 网络。通常的方法是这样的:
wpa_passphrase SSID PASSWORD > CONFIG_FILE
wpa_supplicant -B -iwlan0 -cCONFIG_FILE -Dwext
但是,我不希望密码保留在文件中。是否有类似的方法可以在不使用配置文件(即使只是临时)的情况下配置 WPA2 网络,类似于如何使用单个命令配置开放和 WEP 网络iwconfig wlan0 essid SSID key s:PASSWORD
?
答案1
从我的评论中已经暗示的想法开始,我想提供一个答案。答案经过测试,可以在使用wpa_supplicant
(版本 v2.6)wpa_passphrase
、GNU bash
(版本 4.4.23)和 linux 4.18组合的特定情况下工作。
我希望这里提供的解决方案的目的是避免一些剩余的密码文件为了能够以更通用的 posix 方式采用,但是我只测试了可用于实验的 arch linux 设置。
我跑了
strace wpa_supplicant -i <WIFIINTERFACE> -c <(wpa_passphrase <SSID> <PASSPHRASE>) 2>&1 | less
使用我的 wifi 网络的实际参数。连接已建立。浏览该页面时,我发现了以下内容:
execve("/usr/bin/wpa_supplicant", ["wpa_supplicant", "-i", "wlp0s29u1u2", "-c", "/dev/fd/63"], 0x7fffc7b0ad10 /* 39 vars */) = 0
[....]
openat(AT_FDCWD, "/dev/fd/63", O_RDONLY) = 3
fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
read(3, "network={\n\tssid=\"Oscarone\"\n\t#psk"..., 4096) = 116
read(3, "", 4096) = 0
close(3) = 0
socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE) = 3
bind(3, {sa_family=AF_NETLINK, nl_pid=0, nl_groups=0x000001}, 12) = 0
[....]
这应该是流程替代(the command <(other command)
)的事情如何解决的。可以看到 wpa_supplicant 访问了管道/dev/fd/63
并读取了配置,然后进一步关闭了它,关闭 fd 后3
,文件描述符直接重用于打开socket
.
我仔细检查了via ls -ialh /proc/<pid of wpa_supplicant>/3
,它报告: 这意味着密码短语的唯一临时可访问性(通过作为fd打开的571637 lrwx------ 1 root root 64 Aug 23 20:49 3 -> 'socket:[571092]'
fifo确实已关闭,现在仍然是正确通知的。/dev/fd/53
3
socket
strace
似乎有关这种创建“无文件”“少文件”命令行的方式的信息wpa_supplicant
在 arch linux wiki 中进行了讨论(https://wiki.archlinux.org/index.php/WPA%20supplicant)
我还想指出显而易见的事情。由于您在 shell 中输入密码,请确保它不会被记录在 shell 历史记录中,因此请执行类似于以下操作的操作:
set +o history
wpa_supplicant -i INTERFACE -c <(wpa_passphrase SSID PASSPHRASE) &
set -o history