Advertisement
Guest User

pwwifi

a guest
May 27th, 2018
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.63 KB | None | 0 0
  1. #!/bin/sh
  2. # pwwifi # uwierzytelnienie w sieci WiFi PW
  3. # ato 2013-2015
  4.  
  5. # http://www.cisco.com/c/en/us/td/docs/wireless/controller/4-0/configuration/guide/ccfig40/c40users.html
  6.  
  7. # TODO: curl 32-bitowy:
  8. #t3% curl | grep libssl.so.5
  9. #Shared object "libssl.so.5" not found, required by "curl"
  10. #t3% curl 2> /dev/null | grep libssl.so.5
  11. #t3% curl 2> /dev/null | grep libssl.so.5
  12.  
  13. # TODO: przetestowac grupe prac
  14.  
  15. # TODO: odtwarzac bramke - gdzie ja zpisywac /tmp/$PROG-user-interfejs ?
  16.  
  17. OLD=-old # oryginalne pliki (przyrostek)
  18.  
  19. RESOLV=/etc/resolv.conf # plik konfiguracyjny resolwera DNS
  20. LEASES=/var/db/dhclient.leases # prefix plikow z info
  21. SSID=pwwifi-students
  22.  
  23. #GATE=10.68.0.1 # brmka
  24. PROX=1.1.1.1 # transparent proxy. Potrzebny do logout.
  25.  
  26. usage () {
  27. echo "użycie:
  28. source =$PROG -x pas # zdefiniowanie użytkownika i hasła (opcjonalnie)
  29. $PROG inf # informacie o PWWIFI
  30. $PROG start [interfejs] # połączenie
  31. $PROG stop # odłączenie
  32. -x : zapisz dziennik działania skryptu do pliku /tmp/$PROG-\$\$
  33. Uwaga: skrypt zakłada, że łącze na warstwie drugiej jest już skonfigurowane
  34. Jesli chcemy użyć innego interfejsu musimy zdefiniwać zmienną srodowiskową wlan np.
  35. wlan=wlan1 $PROG start"
  36. exit
  37. }
  38.  
  39. vread () { # prompt zmienna # Wczytaj zmienną
  40. local X
  41. eval "X=\$$2"
  42. read -p "$1 : " X ; [ "$X" ] && setvar $2 "$X"
  43. }
  44.  
  45. fatal () {
  46. echo "$*" 1>&2
  47. exit 1
  48. }
  49.  
  50. warn () { # message # komunikat na stderr
  51. local YELLOW='\e[33m' NOR='\e[m'
  52. [ "$1" ] && echo -e 1>&2 "$YELLOW$1$NOR" # na stderr
  53. }
  54.  
  55. Debug () { # generuj dziennik działania
  56. [ "$LOG" ] && return # już był wolany
  57. LOG=/tmp/$PROG-$$
  58. exec 2> $LOG ; set -x # DEBUG
  59. }
  60.  
  61. setpar () { # file var=par ... # wstaw wartosc parametru "par" do zmiennej "var" (dane w file)
  62. local file var par
  63. file=`$su tail -15 $1 2>/dev/null` # pliku moze nie byc
  64. shift
  65. while [ "$1" ] ;do
  66. var=${1%=*} ; par=${1#*=}
  67. setvar $var $(echo "$file" | grep -w $par | sed 's/.* //;s/;//')
  68. eval [ "\$$var" ] || fatal "brak parametru $par"
  69. shift
  70. done
  71. }
  72.  
  73. getpass () { # prompt zmienna # interakcyjnie wczytaj album/haslo
  74. local val pas2
  75. eval val=\$$2
  76. pas2=a
  77. stty -echo
  78. while [ "$val" != "$pas2" ]; do
  79. vread "$1" $2
  80. eval val=\$$2
  81. # test poprawnosci:
  82. case "$2" in
  83. NRAL) # TODO: tylko cyfry
  84. break # nr albumu wczytujemy jednokrotnie
  85. ;;
  86. PASS) [ ${#val} -ne 12 ] && { warn "haslo musi miec dokladnie 12 znaków" ; continue ;}
  87. ;;
  88. esac
  89. vread "${1%% *} ponownie" pas2
  90. done
  91. stty echo
  92. echo
  93. }
  94.  
  95. pwgetpas () { # [user] # ustawienie zmiennych NRAL i PASS
  96. [ -n "$NRAL" ] && return # ze srodowiska
  97. if [ -r "$PASSFILE" ]; then
  98. read NRAL PASS < $PASSFILE # z pliku
  99. else
  100. getpass "numer albumu" NRAL # z klawiatury
  101. getpass "haslo (PESEL + pierwsza duza litera imienia matki)" PASS
  102. mkdir -m 700 "${PASSFILE%/*}" # zapisanie do pliku
  103. umask 077 ; echo "$NRAL $PASS" > "$PASSFILE"
  104. fi
  105. }
  106.  
  107. setWLAN () { # ssid # ustaw zmienna wlan na interefejs podlaczony do siec 'ssid'
  108. if [ "$wlan" ]; then # uzytkownik zdefiniowal zmienna wlan
  109. ifconfig $wlan 2>/dev/null | grep -q 'ssid $1' ||
  110. fatal "brak interfejsu $wlan, lub interfejs nie jest podlaczony do sieci $1"
  111. else
  112. for wlan in wlan0 wlan1 wlan2 ; do
  113. ifconfig $wlan 2>/dev/null | grep -q "ssid $1" && return
  114. done
  115. wlan=
  116. fatal "brak interfejsu w sieci $1"
  117. fi
  118. }
  119.  
  120. link2 () { # ssid # sprawdzenie czy jest link wifi do 'ssid'
  121. ifconfig $wlan >/dev/null 2>&1 ||
  122. fatal "brak interfejsu $wlan, Wykreuj go lub ustaw odpowiednio zmienna wlan="
  123. ifconfig $wlan | fgrep -q "ssid $1" ||
  124. $su ifconfig $wlan ssid $1 up && sleep 1
  125. ifconfig $wlan | fgrep -q "ssid $1" ||
  126. fatal "interfejs $wlan nie jest podlaczony do sieci $1"
  127. #$wlan: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
  128. # ether 00:24:d7:7e:af:54
  129. # media: IEEE 802.11 Wireless Ethernet OFDM/36Mbps mode 11ng
  130. # status: associated
  131. # ssid pwwifi-students channel 6 (2437 MHz 11g ht/20) bssid 00:21:a0:81:86:c3
  132. # regdomain ETSI country PL authmode OPEN privacy OFF txpower 30
  133. # bmiss 10 scanvalid 60 bgscan bgscanintvl 300 bgscanidle 250
  134. # roam:rssi 7 roam:rate 64 protmode CTS ampdulimit 64k ampdudensity 8
  135. # -amsdutx amsdurx shortgi wme bintval 102
  136. }
  137.  
  138. link3 () { # wlan # inicjalizacja 3 warstwy (IP) przez DHCP
  139. LFILE=$LEASES.$1 # plik zawierajacy prametry uzyskane z dhcp
  140. GATEOLD=`netstat -rn | grep -w default | cut -w -f2` # XXX: moze byc puste
  141. $su service dhclient status $1 > /dev/null ||
  142. $su dhclient $1 # nie mozna uzyc service bez ifconfig_$1 w rc.conf
  143. $su service dhclient status $1 || # ale teraz juz tak.
  144. fatal "dhcp na interfejsie $1 nie dziala"
  145.  
  146. # Uzyskane parametry:
  147. setpar $LFILE MYIP=fixed-address GATE=routers PROX=dhcp-server-identifier DNS=domain-name-servers
  148.  
  149. # Trasa do PROX musi byc jesli nie jest to trasa standardowa!
  150. # Uwaga: trasa ta wypda po "LINK DOWN !
  151. $su route add -host $PROX $GATE 2>/dev/null # to
  152. #$su route add -host $PROX -interface $1 # lub to
  153.  
  154. # Opcjonalny wpis mapowania IP na nazwe:
  155. $su sh -c "echo -e '$MYIP\t`hostname -s`-pwifi\t# adres w sieci $SSID' >> /etc/hosts"
  156.  
  157. # Uwaga mimo zadzialania DHCP ping do GATE/PROX nie dziala. Musi jednak pojawic sie wpis arp dla GATE.
  158.  
  159. #su dhclient wlan0
  160. #DHCPREQUEST on wlan0 to 255.255.255.255 port 67
  161. #DHCPACK from 1.1.1.1
  162. #bound to 10.68.19.59 -- renewal in 1800 seconds.
  163.  
  164. #su service dhclient status wlan0
  165. #dhclient is running as pid 3784
  166.  
  167. #su tail -14 /var/db/dhclient.leases.wlan0
  168. #lease {
  169. # interface "wlan0";
  170. # fixed-address 10.68.19.59;
  171. # option subnet-mask 255.255.0.0;
  172. # option routers 10.68.0.1;
  173. # option domain-name-servers 10.68.0.1;
  174. # option domain-name "pwifi-studets.pw.edu.pl";
  175. # option dhcp-lease-time 3600;
  176. # option dhcp-message-type 5;
  177. # option dhcp-server-identifier 1.1.1.1;
  178. # renew 6 2014/5/17 19:19:37;
  179. # rebind 6 2014/5/17 19:42:07;
  180. # expire 6 2014/5/17 19:49:37;
  181. #}
  182.  
  183. #$wlan: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
  184. # inet 10.68.21.237 netmask 255.255.0.0 broadcast 10.68.255.255
  185. }
  186.  
  187. # TODO: jak przeslac PASS nie w linii wywolania (niebezpieczne - inni widza) ?
  188. webauth () { # Web Authentication
  189. URL=https://$PROX/login.html #URL=https://$PROX/login_noscript.html
  190. OKT='<td align="center">Login Successful</td>'
  191.  
  192. pwgetpas # ustawienie zmiennych NRAL i PASS (UserName i Password)
  193. DAT="username=$NRAL&password=$PASS&buttonClicked=4"
  194. OUT=$(curl --connect-timeout 1 -k -s -d "$DAT" --url $URL) ; ex=$?
  195. if [ $ex -eq 28 -o $ex -eq 130 -o -z "$OUT" ]; then # brak odpowiedzi - druga proba po dodaniu trasy:
  196. $su route add -host $PROX $GATE
  197. OUT=$(curl --connect-timeout 1 -k -s -d "$DAT" --url $URL)
  198. fi
  199. if echo "$OUT" | fgrep -q "$OKT" ; then
  200. warn "Web Authentication OK"
  201. else
  202. #warn "brak odpowiedzi 'Login Successful'"
  203. #The username specified cannot be used at this time. Perhaps the username is already logged into the system?
  204. info_msg=$(echo "$OUT" | fgrep 'info_msg' | cut -d\" -f10)
  205. warn "$info_msg" ; exit 1
  206. LOG=/tmp/$PROG-$USER-err-$$.html
  207. echo "$OUT" > $LOG # XXX: debug log
  208. arp -i $wlan -an | grep $GATE
  209. echo $LOG
  210. echo links $URL
  211. echo "napisz exit aby wrocic do $PROG"
  212. $SHELL || exit
  213. #fatal "brak odpowiedzi 'Login Successful'.\nSprobuj zalogowac sie recznie poleceniem: links $URL"
  214. fi
  215. }
  216.  
  217. linktest () { # host # zwraca OK jest $1 odpowiada
  218. ping -q -c1 -t1 $1 >/dev/null 2>&1
  219. }
  220.  
  221. trasa () { # przestawienie trasy standardowej (bramki)
  222. echo GATE=$GATE OLD=$GATEOLD # GATE=10.68.0.1
  223. [ "$GATE" != "$GATEOLD" ] &&
  224. $su route change default $GATE &&
  225. traceroute wp.pl # test czy dziala
  226. }
  227.  
  228. resolver () { # Przestawienie DNS-a
  229. DNSOLD=
  230. echo DNS=$DNS # DNS=10.68.0.1
  231. $su sed -i$OLD "s/$DNSOLD/$DNS/" $RESOLV
  232. }
  233.  
  234. pwlogin () { # wlan # zlogowanie sie i skonfigurowanie sieci
  235. [ "$1" ] && wlan=$1
  236. link2 $SSID # sprawdzenie/inicjacja warstwy lacza danych
  237. link3 $wlan # sprawdzenie/inicjacja warstwy sieci
  238. webauth # uwiezytelnienie:
  239. linktest $GATE || fatal "bramka $GATE nie odpowiada"
  240. trasa #
  241. #resolver # XXX: niepotrzebne - dhcp dodaje
  242. #logger -p # XXX: dziennik ?
  243. }
  244.  
  245. pwlogout () { # TODO: odtworzyc trase standardowo ?
  246.  
  247. LFILE=$LEASES.$wlan # plik zawierajacy prametry uzyskane z dhcp
  248. setpar $LFILE MYIP=fixed-address GATE=routers PROX=dhcp-server-identifier DNS=domain-name-servers
  249.  
  250. URL=https://$PROX/logout.html
  251. OKT="To complete the log off process and to prevent access to unauthorized users"
  252.  
  253. pwgetpas # ustawienie zmiennych NRAL i PASS
  254. DAT="buttonClicked=4&username=$NRAL&password=$PASS"
  255. OUT=$(curl --connect-timeout 1 -k -s -d "$DAT" --url $URL) ; ex=$?
  256. if [ $ex -eq 28 -o $ex -eq 130 -o -z "$OUT" ]; then # brak odpowiedzi - druga proba po dodaniu trasy:
  257. $su route add -host $PROX $GATE
  258. OUT=$(curl --connect-timeout 1 -k -s -d "$DAT" --url $URL)
  259. fi
  260. if ! echo "$OUT" | fgrep -q "$OKT" ; then
  261. LOG=/tmp/$PROG-$USER-err-$$.html
  262. echo "$OUT" > $LOG # XXX: debug log
  263. warn "$LOG"
  264. exit 1
  265. fi
  266.  
  267. warn "Loggout OK"
  268.  
  269. # Test czy rzeczywiscie rozlaczone:
  270. linktest $GATE && fatal "bramka $GATE nadal odpowiada"
  271.  
  272. # Stop dhclient-a
  273. $su pkill -u _dhcp -lf "dhclient: $wlan" # service stop nie dziala (j.w) XXX: kill -15 ?
  274.  
  275. # Resolver:
  276. [ "$DNS" ] && $su sed -i$OLD "/$DNS/d" $RESOLV # usuniecie dodanego DNS-a
  277.  
  278. # Hosts
  279. [ "$MYIP" ] && $su sed -i$OLD "/$MYIP/d" /etc/hosts # usuniecie dodanego mapowania
  280.  
  281. # Trasa:
  282. $su route delete -host $PROX #
  283. case "$GATEOLD" in # i poprzedniej bramki: TODO
  284. '') echo $su route delete default ;; # nie bylo jej
  285. *) echo $su route change default $GATEOLD ;; #
  286. esac
  287.  
  288. # Usuniecie adresiu z interfejsu:
  289. $su ifconfig $wlan $MYIP delete
  290. }
  291.  
  292. pwinfo () {
  293. echo "sieć pwwifi może czasami nie działać :(
  294. Uczelniany HelpDesk sieci pwwifi:
  295. http://5999.pw.edu.pl/
  296. 5999@pw.edu.pl"
  297. exit
  298. }
  299.  
  300. pwstatus () { # status polaczenia
  301. LFILE=$LEASES.$wlan # plik zawierajacy prametry uzyskane z dhcp
  302. setpar $LFILE MYIP=fixed-address GATE=routers PROX=dhcp-server-identifier DNS=domain-name-servers
  303. linktest $GATE && { warn "ok - bramka $GATE odpowiada" ; return ; }
  304. warn "bramka $GATE nie odpowiada"
  305. exit 1
  306. ifconfig $wlan
  307. #linktest $PROX || warn "proxy $PROX nie odpowiada"
  308. #exit
  309. dhc l $wlan
  310. tt4 -n
  311. }
  312.  
  313. # START
  314.  
  315. PROG=${0##*/}
  316.  
  317. case "$1" in
  318. -x) shift ; Debug ;;
  319. esac
  320.  
  321. case "$1" in
  322. inf*) cmd=pwinfo ;;
  323. star*) cmd=pwlogin ;;
  324. sta*) cmd=pwstatus ;;
  325. sto*) cmd=pwlogout ;;
  326. pas*) cmd=pwgetpas ; export NRAL PASS ;; # export gdy source (bezpieczniej niz w pliku)
  327. ''|*) usage ;;
  328. esac
  329.  
  330. [ `id -ng` = prac ] && SSID=pwwifi # dla grupy prac inny SSID
  331.  
  332. setWLAN $SSID # ustaw wlan na interefejs podlaczony do siec
  333.  
  334. [ `id -un` = root ] || su=sudo
  335.  
  336. eval HOME=~${SUDO_USER:-$USER}
  337.  
  338. PASSFILE=$HOME/securedir/$PROG # prywatny plik uzytkownika z haslem
  339.  
  340. $cmd $2 # $2 moze zawierac wlan dla start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement