前几天搞了一下开机自启动认证。环境是arch。学校的认证是H3C的,但学校官方给的linux版认证客户端臃肿且只支持ubuntu、rehat及衍生版。好在已经大牛解决这一问题,出了个小巧的python版的认证客户端yah3c
运行yah3c只要在终端输入sudo yah3c即可,但是因为用了sudo,必定还要手工输入密码,而且运行yah3c时还有一处要选择是否新建账号或者使用哪一个已经使用过的账号。要想实验开机自启动认证,就得先除去这两个输入。
首先是sudo的密码输入除去,此外后面用到的ethtool也要除去输入密码。运行sudo visudo 加入
$USER ALL=NOPASSWD: /usr/bin/yah3c, /usr/sbin/ethtool
即可。
然后是判断网线是否接上了,如没接上则直接退出。当连上网线时,sudo ethool eth0 的输出中会有 “L:ink detected yes”的字符串,所以检查的代码如下:
islink=`sudo ethtool eth0 | grep 'Link detected: yes'`if [ -z "$islink" ]then exitfi
因为yah3c只是认证,还要用networkmanager或者dhcp自动获取一下ip。我这里用的是networkmanager,命令如下 :
nmcli con up id "有线连接的名称"
然后还要考虑一下如果第一次认证时失败了能让它循环认证。我判断是否认证成功的方法是看能否获取到ip。检查ip可以用ifconfig再用正则表达式扣出来。代码如下:
ifconfig eth0 | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2}
再考虑到有可能在无线网络的环境,所以还要检测一下能否通过wlan0得到ip,若能得到,则退出循环,避免死循环。
if [ -z $theip ] then theip=`ifconfig wlan0 | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2}'` fi
再考虑网络阻塞一直连接不上的状况,要设置个超时时间,避免一直循环着浪费cpu
所以最后的脚本如下:
#!/bin/bashislink=`sudo ethtool eth0 | grep 'Link detected: yes'`if [ -z "$islink" ]then exitfitheip='';time=`date +%s`difftime=0while [[ -z $theip && $difftime -lt 60 ]]do echo 1 | sudo yah3c & nmcli con up id "Wired connection 1" sleep 2 theip=`ifconfig eth0 | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2}'` sleep 1 if [ -z $theip ] then theip=`ifconfig wlan0 | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2}'` fi let "difftime=`date +%s`-$time" echo $difftimedone
再最后就是把脚本放到合适的地方。我用的是kde环境,在kde环境准备好后会自动运行 ~/.kde4/Autostart/文件夹下的脚本。所以我便把脚本放到那。
需要说明的是,kde在执行Autostart下的脚本时,在执行下一个任务时,会关闭前一个任务。所以sudo yah3c后面的&不可或缺,他将告诉系统在后台执行yah3c。我之前就是因为少了这个&导致没能保留yah3c进程因而开机自启动认 证几分钟后就掉线了。
另外,我觉得开机自启动还是一个比较笨的方法的,如果能在第一次检测到有网线连接时启动脚本,那就perfect了
如果你有更好的方法,请告知我。