-
-
Save lukicdarkoo/6b92d182d37d0a10400060d8344f86e4 to your computer and use it in GitHub Desktop.
| #!/bin/sh | |
| # The script configures simultaneous AP and Managed Mode Wifi on Raspberry Pi Zero W (should also work on Raspberry Pi 3) | |
| # Usage: curl https://gist.githubusercontent.com/lukicdarkoo/6b92d182d37d0a10400060d8344f86e4/raw | sh -s WifiSSID WifiPass APSSID APPass | |
| # Licence: GPLv3 | |
| # Author: Darko Lukic <[email protected]> | |
| # Special thanks to: https://albeec13.github.io/2017/09/26/raspberry-pi-zero-w-simultaneous-ap-and-managed-mode-wifi/ | |
| MAC_ADDRESS="$(cat /sys/class/net/wlan0/address)" | |
| CLIENT_SSID="${1}" | |
| CLIENT_PASSPHRASE="${2}" | |
| AP_SSID="${3}" | |
| AP_PASSPHRASE="${4}" | |
| # Install dependencies | |
| sudo apt -y update | |
| sudo apt -y upgrade | |
| sudo apt -y install dnsmasq dhcpcd hostapd | |
| # Populate `/etc/udev/rules.d/70-persistent-net.rules` | |
| sudo bash -c 'cat > /etc/udev/rules.d/70-persistent-net.rules' << EOF | |
| SUBSYSTEM=="ieee80211", ACTION=="add|change", ATTR{macaddress}=="${MAC_ADDRESS}", KERNEL=="phy0", \ | |
| RUN+="/sbin/iw phy phy0 interface add ap0 type __ap", \ | |
| RUN+="/bin/ip link set ap0 address ${MAC_ADDRESS} | |
| EOF | |
| # Populate `/etc/dnsmasq.conf` | |
| sudo bash -c 'cat > /etc/dnsmasq.conf' << EOF | |
| interface=lo,ap0 | |
| no-dhcp-interface=lo,wlan0 | |
| bind-interfaces | |
| server=8.8.8.8 | |
| domain-needed | |
| bogus-priv | |
| dhcp-range=192.168.10.50,192.168.10.150,12h | |
| EOF | |
| # Populate `/etc/hostapd/hostapd.conf` | |
| sudo bash -c 'cat > /etc/hostapd/hostapd.conf' << EOF | |
| ctrl_interface=/var/run/hostapd | |
| ctrl_interface_group=0 | |
| interface=ap0 | |
| driver=nl80211 | |
| ssid=${AP_SSID} | |
| hw_mode=g | |
| channel=11 | |
| wmm_enabled=0 | |
| macaddr_acl=0 | |
| auth_algs=1 | |
| wpa=2PASSPHRASE | |
| wpa_passphrase=${AP_PASSPHRASE} | |
| wpa_key_mgmt=WPA-PSK | |
| wpa_pairwise=TKIP CCMP | |
| rsn_pairwise=CCMP | |
| EOF | |
| # Populate `/etc/default/hostapd` | |
| sudo bash -c 'cat > /etc/default/hostapd' << EOF | |
| DAEMON_CONF="/etc/hostapd/hostapd.conf" | |
| EOF | |
| # Populate `/etc/wpa_supplicant/wpa_supplicant.conf` | |
| sudo bash -c 'cat > /etc/wpa_supplicant/wpa_supplicant.conf' << EOF | |
| country=US | |
| ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev | |
| update_config=1 | |
| network={ | |
| ssid="${CLIENT_SSID}" | |
| psk="${CLIENT_PASSPHRASE}" | |
| id_str="AP1" | |
| } | |
| EOF | |
| # Populate `/etc/network/interfaces` | |
| sudo bash -c 'cat > /etc/network/interfaces' << EOF | |
| source-directory /etc/network/interfaces.d | |
| auto lo | |
| auto ap0 | |
| auto wlan0 | |
| iface lo inet loopback | |
| allow-hotplug ap0 | |
| iface ap0 inet static | |
| address 192.168.10.1 | |
| netmask 255.255.255.0 | |
| hostapd /etc/hostapd/hostapd.conf | |
| allow-hotplug wlan0 | |
| iface wlan0 inet manual | |
| wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf | |
| iface AP1 inet dhcp | |
| EOF | |
| # Populate `/bin/start_wifi.sh` | |
| sudo bash -c 'cat > /bin/start_wifi.sh' << EOF | |
| echo 'Starting Wifi AP and client...' | |
| sleep 30 | |
| sudo ifdown --force wlan0 | |
| sudo ifdown --force ap0 | |
| sudo ifup ap0 | |
| sudo ifup wlan0 | |
| sudo sysctl -w net.ipv4.ip_forward=1 | |
| sudo iptables -t nat -A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j MASQUERADE | |
| sudo systemctl restart dnsmasq | |
| EOF | |
| sudo chmod +x /bin/start_wifi.sh | |
| crontab -l | { cat; echo "@reboot /bin/start_wifi.sh"; } | crontab - | |
| echo "Wifi configuration is finished! Please reboot your Raspberry Pi to apply changes..." |
thank you. It runs fine.
Could you open the source for how to organize the html page used on the web?
I wonder.
I'm studying curl and bash.
Thank you.
Hello Lukic,
thank you very much for this ! It worked perfectly for me using only your script on a RPi4. It worked directly on first attempt !
uname -r -> 5.10.17-v7l+
This saved many hours for me..
Best regards,
Tugrul
Has anyone got this working with alternative hostapd seetings of "hw_mode=n" or "ieee80211n=1" .. if I use either of these, the SSID is hidden and cant connect to it
Thanks for the base.
-
In line 23 missing double quote by the end of line. Should be:
RUN+="/bin/ip link set ap0 address ${MAC_ADDRESS}" -
It's better to set network config in
/etc/wpa_supplicant/wpa_supplicant.conf
network={
ssid="${CLIENT_SSID}"
psk="${CLIENT_PASSPHRASE}"
id_str="AP1"
scan_ssid=1
key_mgmt=WPA-PSK
priority=100
}
This way RPi can connect to hidden network too.
고맙습니다. 실행이 잘 됩니다.
웹에서 사용된 html 페이지는 어떻게 구성하는지 소스를 오픈 해주시겠습니까?
궁금합니다.
curl과 bash를 공부 중입니다.
감사합니다.