Bagaimana cara saya mengautentikasi ke jaringan "terbuka" penyedia nirkabel tanpa menggunakan browser?

13

Pengaturan semacam ini tampaknya umum di pusat perbelanjaan dan bandara. Di Kanada Barat, Shaw menyediakan layanan seperti itu dan menyebutnya "Shaw Open". Saya cukup yakin lokal lain memiliki layanan serupa dari penyedia seperti T-Mobile, dll.

Dari sesuatu seperti ponsel itu tidak terlalu rumit untuk dilakukan. Tidak diperlukan otentikasi untuk terhubung ke hotspot wifi karena "terbuka" untuk akses publik. Tetapi ponsel saya tidak akan terhubung ke situs web atau layanan jarak jauh melalui aplikasi sampai saya menggunakan browser saya dan masuk ke halaman web tertentu yang disediakan oleh ISP .

Pertanyaan saya yang sederhana adalah: Bagaimana cara mengotomatiskan langkah otentikasi dari perangkat yang biasanya tidak memiliki browser tradisional?

Dalam kasus khusus saya, saya memiliki raspberry Pi yang dikonfigurasi dengan perangkat lunak yang ingin saya gunakan di pameran dagang, dll. Lokasi tesis memiliki hotspot "terbuka" yang sama. Raspi dimaksudkan untuk mandiri. Itu hanya melakukan bisnisnya dan berbicara ke situs web. Tetapi koneksi keluar ini diblokir oleh koneksi "terbuka" ISP karena saya belum, saya juga tidak dapat menyelesaikan bagian browser dari proses.

Dengan asumsi saya memiliki kredensial untuk melakukan ini pada jaringan penyedia tertentu, bagaimana saya bisa mengotomatiskan bagian dari proses tanpa mengharuskan saya untuk membuka sesi terminal ke Pi? Teknologi apa yang bahkan digunakan di sini, yang bisa saya cari?

Gurita
sumber
Dengan asumsi Pi Anda memiliki Linux, apakah ada wgetprogram yang diinstal?
David Wilkins
1
Pertanyaan Anda sebenarnya bukan tentang Linux atau Unix, itu akan lebih cocok untuk Super User . Juga, apakah ada alasan Anda tidak ingin menginstal browser pada pi? Anda selalu dapat menggunakan peramban baris perintah berbasis teks sederhana seperti links2misalnya.
terdon
@terdon Selama Pi menjalankan Linux atau varian Unix lainnya, pertanyaannya adalah benar-benar topik di sini. Sebaliknya, saya tidak berpikir Pi adalah komputer sesuai dengan definisi SU (tapi saya tidak yakin tentang itu, saya tidak pernah mengerti definisi itu atau melihatnya ditulis di mana saja).
Gilles 'SO- stop being evil'
@ Gilles ya, ini tentang topik, saya tidak memilih untuk menutup. Saya hanya menyarankan itu mungkin lebih cocok untuk SU. Dan ya, pertanyaan pi diterima di sana.
terdon

Jawaban:

12

Kunci untuk memecahkan masalah seperti ini adalah mengetahui bagaimana cara mengajukan pertanyaan. Saya mencari di Google mencari "cara mengakses wifi roti panera" dan menemukan permata ini.

Artikel ini memiliki beberapa skrip yang dapat digunakan untuk memfasilitasi masuk otomatis. Saya telah memilih untuk menyertakan contoh untuk Panera Bread yang memanfaatkan pustaka Mekanis Python.

Solusinya memanfaatkan direktori NetworkManagerdispatcher.d untuk menjalankan skrip setiap kali antarmuka jaringan tertentu naik atau turun. Artikel merinci skrip yang akan Anda tempatkan di direktori ini /etc/NetworkManager/dispatch.d,, dipanggil 07-autologin_openwifi. Ini skripnya:

#!/bin/bash
#------------------------------
# By Fahad Alduraibi
# Last update: June 12, 2012
# Version: 1.1
#------------------------------

export LC_ALL=C
LogFile="/var/log/07-WIFI_ACCESS.log"

# The parameters that get passed to the script are:
# $1 = The interface name ( eth0, wlan0 ...etc)
# $2 = Interface status ( "up" or "down" )

# Check if wireless status is up
# I have two wifi cards in my laptop, named "wlan0 and wlan1"
# so I use regular expression "wlan[01]" to match both of them.
if [[ "$1" =~ wlan[01] && $2 == "up" ]]; then

    # Get the network name from "iwconfig" or (can also locate the network based on IP or MAC address if needed)
    ESSID=$(/sbin/iwconfig $1 | grep ESSID | cut -d'"' -f2)

    # Record the date and time for debugging purposes only
    echo "[`date`] ESSID=($ESSID)" >> $LogFile

    # If the wireless name matches then run its python script
    if [[ "$ESSID" == "BCPL-PUBLIC-WIFI" ]]; then
        /usr/bin/python /myscripts/baltimore-county_library_wifi.py 1>> $LogFile 2>&1
    elif [[ "$ESSID" == "PANERA" ]]; then
        /usr/bin/python /myscripts/panera.py 1>> $LogFile 2>&1
    elif [[ "$ESSID" == "Nordstrom_Wi-Fi" ]]; then
        /usr/bin/python /myscripts/nordstrom.py 1>> $LogFile 2>&1
    #elif .... (you can add more open wifi here)

    fi
fi

#if [[ "$1" =~ wlan[01] && $2 == "down" ]]; then
    ##If you want to do somehting when the network is down
#fi

Dan inilah skrip roti Panera panera.py:

#------------------------------
# By Fahad Alduraibi
# Last update: June 12, 2012
# Version: 1.1
#------------------------------
import mechanize
import sys

br = mechanize.Browser()
br.set_handle_equiv(True)
#br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0')]

testURL = 'http://fadvisor.net/blog/'
response = br.open(testURL)

if response.geturl() == testURL:
  print "FAD: You are already logged in to Panera."
  sys.exit()

try:
  forms = mechanize.ParseResponse(response, backwards_compat=False)
except:
  print "FAD: Error in parsing forms, Am I already logged in to Panera?"
  sys.exit()

response.close

form = forms[0]
#print form
#print "----------------------------------- Login"
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- Validate"
#print
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- ConfirmLogin New"
#print
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- ConfirmLogin Validate"
#print
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- CompleteLogin New"
#print

request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- HttpLoginRequest"
#print

request = form.click()
response = br.open(request)
#print response.read()

response.close()
print "--- Panera Done ---"

Saya mendorong Anda untuk membaca seluruh artikel jika Anda tertarik pada metode lain untuk melakukan login otomatis. Artikel ini memiliki beberapa jaringan WiFi terbuka yang ditulis untuk wilayah Baltimore, MD.

slm
sumber
Ini mungkin satu-satunya solusi, sayangnya itu membutuhkan sedikit rekayasa balik untuk menentukan url dan formulir isian yang harus diserahkan untuk setiap penyedia yang berbeda yang tentu saja memiliki tantangannya sendiri, paling tidak pengembang harus mengetahui semua penyedia yang mungkin dan memiliki akses langsung ke mereka; belum tentu memungkinkan untuk skenario khusus saya. Saya kira itu yang terbaik yang bisa saya harapkan. Tentu saja, salah satu solusi penyedia dapat terputus begitu mereka memutuskan untuk memperbarui formulir otentikasi web mereka.
Octopus
1

Bergantung pada bagaimana otentikasi diterapkan, Anda mungkin dapat mengirim permintaan HTTP untuk mendapatkan akses. Ini tergantung pada banyak aspek dari implementasi tertentu.

Perlu diingat, jenis otentikasi ini ditempatkan untuk menjaga sistem otonom keluar sementara hanya memungkinkan browser untuk memiliki akses, yang persis apa yang Anda coba untuk mengelak.

Idealnya, Anda memiliki telepon yang dapat Anda atur sebagai hotspot wifi dan menghubungkan Pi Anda ke jaringan itu sehingga Anda dapat melakukan apa pun yang Anda inginkan, tetapi itu tidak gratis.

TL; DR: Pengemis tidak bisa menjadi pemilih

David Wilkins
sumber
1
Jika dilakukan melalui peramban, ia harus menggunakan HTTP, jadi ini tentu saja mungkin. Namun, karena tidak ada protokol atau standar untuk otentikasi semacam ini (AFAIK), Anda harus mengimplementasikan sesuatu per penyedia. Yang tidak akan berguna jika Anda ingin membawanya ke suatu tempat Anda tidak memiliki implementasi. Saya akan menggunakan hotspot ponsel - itu akan gratis jika Anda menghubungkan ponsel ke jaringan terbuka.
goldilocks
1

Jika Anda memiliki perangkat jaringan kedua, Anda dapat mengatur penerusan NAT. Sambungkan ke jaringan "internal" Anda dengan ponsel atau laptop Anda dan minta RPi untuk meneruskan koneksi itu ke jaringan pada umumnya. Kemudian otentikasi dengan browser di laptop atau ponsel Anda. Jaringan melihat alamat MAC eksternal RPi Anda dan menghubungkannya dengan koneksi yang diautentikasi.

Saya secara teratur melakukan ini dengan router perjalanan saku (AirPort Express lama) untuk terhubung ke internet hotel, kemudian saya dapat menghubungkan Chromecast dan perangkat lain ke jaringan itu tanpa harus mengautentikasi ulang.

Lebih sederhana lagi ... Jika perangkat jaringan Anda adalah usb dan berfungsi dengan laptop, sambungkan ke laptop dan masuk ke jaringan. Kemudian sambungkan kembali ke RPi. Itu harus bekerja selama beberapa jam.

Mike DeAngelo
sumber