Sorry! I have an entry in vimrc for my mail that replaces '>>' for '> >'. That screwed the code, it was a bad idea. Here the corrected code:
========================================================================= #!/bin/sh # ~/bin/wifi.sh - occasional wireless connection in OpenBSD [ "`whoami`" != "root" ] && { echo "You must be root"; exit 1; } # PUT YOUR NORMAL USER HERE user=morlock # IMPORTANT: if you don't use dhcp in your home LAN save a copy of your # LAN version of /etc/resolv.conf and /etc/hosts to this directory. backdir=/home/$user/.wifi [ ! -d $backdir ] && mkdir $backdir rec=$backdir/stored [ ! -e $rec ] && { touch $rec chmod 600 $rec chown $user:$user $rec } tmp=/tmp/wifi-`date +%H%M%S` # FUNCTIONS cancel() { ifconfig $int -inet -inet6 -nwid -bssid -wpakey -nwkey ifconfig $int down [ -f $tmp ] && rm $tmp [ -f $stored_tmp ] && rm $stored_tmp exit 1 } get_password() { if grep -i $bssid $rec; then echo -n "Use the above \"$nwid\" stored password? [Y/n] " read answer if [ "$answer" != "n" ]; then password=`grep -i $bssid $rec | awk '{ print $2 }'` else printf "$nwid $enc $message: " read password fi else printf "$nwid $enc $message: " read password fi } # SELECT WIRELESS INTERFACE interfaces="`ifconfig wlan | awk -F: '/^[^\t]/ { print $1 }' | xargs`" if [ ! "$interfaces" ]; then echo "No wireless interfaces found." 1>&2 exit 1 elif [ `echo "$interfaces" | wc -w | xargs` -gt 1 ]; then echo $interfaces int=none until echo $interfaces | grep -q $int; do echo -n "Interface? " read int done else int=$interfaces fi trap cancel INT ifconfig $int up ifconfig $int -inet -inet6 -nwid -bssid -wpakey -nwkey # SCAN AND CHOOSE AN ACCESS POINT echo 'Scanning on '$int'...' ifconfig $int scan | awk -F'\t' '/\tnwid/ { print $3 }' | nl -s') ' > $tmp if [ `awk 'END { print NR }' $tmp` -eq 0 ]; then echo "No access points found." cancel elif [ `awk 'END { print NR }' $tmp` -gt 1 ]; then sed 's/\(.*\) nwid \(.*\) chan .*/\1 \2/' $tmp ap=0 until egrep -q "^ *$ap\) nwid" $tmp ; do echo -n "number? " read ap done else ap=`awk -F\) '{ print $1 }' $tmp | sed 's/ *//'` fi # GET AP DATA bssid=`egrep '^ +'$ap')' $tmp | egrep -o '(..:){5}..' | tr "[a-f]" "[A-F]"` nwid=`grep -i $bssid $tmp | sed 's/.* nwid \(.*\) chan .*/\1/' | sed 's/"//g'` enc=`grep -i $bssid $tmp | awk -F, '{ print $NF }'` case $enc in wep) key=nwkey message="key (for HEX prefix 0x)" get_password ;; wpa*) key=wpakey message="passphrase" get_password ;; *) key='-wpakey -nwkey' password='' ;; esac # SET UP INTERFACE ifconfig $int nwid "$nwid" $key $password || cancel # CONNECTION ATTEMPT /home/$user/bin/dhcp-connect.sh $int || cancel # STORE PASSWORD [ "$password" != "" ] && { sed -i "/$bssid/d" $rec echo -e "$bssid\t$password" >> $rec } # End of wifi.sh ======================================================================= #!/bin/sh # ~/bin/dhcp-connect.sh # Connect using dhcp and set hostname (OpenBSD version) [ "`whoami`" != "root" ] && { echo "You must be root"; exit 1; } # PUT YOUR NORMAL USER HERE user=morlock # IMPORTANT: if you don't use dhcp in your home LAN save a copy of your # LAN version of /etc/resolv.conf and /etc/hosts to this directory. backdir=/home/$user/.wifi int=$1 [ "$int" ] || { echo "Usage: `basename $0` <interface>" exit 1 } clean_start() { for i in `ps xw | grep dhclient | grep $int | \ awk '{ print $1 }'` do [ $i ] && kill $i done } cancel() { clean_start [ -f $backdir/hosts ] && /home/$user/bin/reset-LAN.sh exit 1 } reset_LAN_at_shutdown() { [ ! -e /etc/rc.shutdown ] && { echo "# /etc/rc.shutdown" > /etc/rc.shutdown chmod 600 /etc/rc.shutdown } grep -q "# Reset LAN" /etc/rc.shutdown 2>/dev/null || { echo >>/etc/rc.shutdown echo '# Reset LAN' >>/etc/rc.shutdown echo -n "[ -x /home/$user/bin/reset-LAN.sh ] && " \ >>/etc/rc.shutdown echo "/home/$user/bin/reset-LAN.sh" >>/etc/rc.shutdown } } dhclientConf() { grep -q "send host-name \"`hostname`\"" \ /etc/dhclient.conf 2>/dev/null || echo "send host-name \"`hostname`\";" \ >>/etc/dhclient.conf } clean_start trap cancel INT # Comment this if you think you don't need it dhclientConf # Attempt a connection dhclient $int ip=`ifconfig $int | awk '/inet/ { print $2 }'` if [ "$ip" ]; then [ -e $backdir/hosts ] && { # Set hosts file (Optional) echo "# /etc/hosts" >/etc/hosts echo "# (by $0)" >>/etc/hosts echo -e "127.0.0.1\tlocalhost" >>/etc/hosts echo -e "::1\tlocalhost" >>/etc/hosts echo -e "$ip\t`hostname`\t`hostname -s`" >>/etc/hosts reset_LAN_at_shutdown /etc/rc.d/smtpd restart grep -q ntpd /etc/rc.conf.local && /etc/rc.d/ntpd restart } else echo "`basename $0`: could't establish the connection." cancel fi # End of dhcp-connect.sh ============================================================================= #!/bin/sh # ~/bin/reset-LAN.sh - Reset your home LAN (OpenBSD version) [ "`whoami`" != "root" ] && { echo "You must be root" 1>&2; exit 1; } # PUT YOUR NORMAL USER HERE user=morlock # IMPORTANT: if you don't use dhcp in your home LAN save a copy of your # LAN version of /etc/resolv.conf and /etc/hosts to this directory. backdir=/home/$user/.wifi diff -q $backdir/resolv.conf /etc/resolv.conf || { cp $backdir/resolv.conf /etc || exit 1 echo "`basename $0`: restored LAN version of /etc/resolv.conf" } diff -q $backdir/hosts /etc/hosts || { cp $backdir/hosts /etc || exit 1 echo "`basename $0`: restored LAN version of /etc/hosts" } # End of reset-LAN.sh *** Finally, to add a menu entry to the window manager: echo 'permit nopass <your_user> cmd /home/<your_user>/bin/wifi.sh' \ >>/etc/doas.conf In ~/.cwmrc: command wifi-connect "xterm -title wifi-connect \ -e \"doas /home/<your_user>/bin/wifi.sh; echo 'quiting...'; sleep 4\"" In a ~/.fvwmrc menu entry: + "WiFi connect" Exec exec xterm -title "WIFI Connect" \ -e "doas /home/<your_user>/bin/wifi.sh; echo 'quiting...'; sleep 4"