Skip to content

Latest commit

 

History

History
234 lines (166 loc) · 11.8 KB

README.markdown

File metadata and controls

234 lines (166 loc) · 11.8 KB

pysrun

pysrun 是用 Python 编写的北师大上网认证网关客户端.

使用说明

快速入门三部曲

  1. 下载文件后, 用您惯用的文本编辑器, 打开 pysrun.cfg.default 这个文件.
  2. 修改这个文件, 在 interface= 后面填入您网络连接的界面名称 (ifconfig 命令可以帮您查看). 在 usernamepassword 后面分别填入您从学校处获得的用户名和密码. 保存这个文件到您主目录下这个路径 ~/.pysrun.cfg.
  3. 运行命令 ./pysrun login. 这就可以登录学校网络了.

完成入门三部曲后, 您可能希望将 pysrun 这个可执行文件拷入 PATH 环境变量所包括的目录路径下 (可能需要相关权限). 如果您觉得必要, 也可以设置配置文件 ~/.pysrun.cfg 的可读权限, 保护您信息的安全. 更多进阶说明, 请继续阅读本文档.

安装

本脚本无需安装其它程序库, 只需要下载即可执行. 需要用到的文件有两个:

  1. pysrun: 可执行 Python 脚本,
  2. 配置文件, 默认路径为 ~/.pysrun.cfg.

软件包提供了样例配置文件 pysrun.cfg.default. 第一次使用前, 建议将其拷贝到 ~/.pysrun.cfg, 同时填入包括用户名密码在内的相关信息. 您可以将可执行文件 pysrun 放在任何路径下, 建议放在 PATH 环境变量所包含的目录下.

严格说来, 配置文件不是必须的. 但是, 因为选项一般很少改动, 使用配置文件会比较方便.

配置文件

配置文件分为如下部分, 每个部分中有若干个选项.

  1. [Server] 填写北师大认证服务器信息. 除非有很特殊的情况, 请不要修改这组选项.
  • address: 服务器 IP 地址或主机名. 默认值: 172.16.202.201.
  • port: 服务器监听端口. 客户端通过向这个端口上监听的服务器发送信息来工作. 默认值: 3333.
  1. [Client] 用于配置客户端所运行需要的主机信息.
  • interface: 在哪个网络界面上认证. 此界面的MAC地址将成为认证信息的一部分. 对于登入和登出操作, 如果此界面可用, 则用于同认证服务器的通信的本地套接字都将 bind() 到该界面的 IP 地址. 默认值: eth0 (小窍门: 请查看 ifconfig 之类命令的输出决定界面的名称).
  1. [Account] 填写用户帐号信息.
  • username: 帐号 (通常为学工号), 无默认值.
  • password: 密码, 无默认值.
  1. [Session] 用于配置会话状态的保存.
  • uidfile: 保存所谓 "uid" 信息的文件路径. 每次登入, 服务器会返回一个 uid. 登出时需要使用这个 uid 退出. uidfile 路径所指示的文件用来存放每次登入所返回的uid. 在登出前, 不要修改这个文件的内容或者移动乃至删除这个文件. 默认值: ~/.pysrun_uid.

配置文件的格式要求如下:

  1. 文件由行组成. 满足合格要求的行, 必须是 key = value 的形式. 主键 (key), 等号和键值 (value) 都可以被任意多的空白字符 (如空格和制表符) 所包围, 空白字符可以出现在主键或键值中, 但不能是开头或结尾的字符. 如果有多个等号, 第一个等号为主键和键值的分隔符, 其余为键值的一部分.
  2. 满足合格要求的主键-键值对, 其主键或键值都不能为空.
  3. 注释文字以井号 (#) 开始.
  4. 任何不满足以上要求的行, 都被忽略. 可以认为它们都是注释.
  5. 如果一个主键在文件中重复出现, 最后一次出现的合格键值起作用.

在配置文件中, 上述被中括号括起来的部分 (如 [Server] ) 起到每一节标题的作用. 在 0.4 版本以前, 它们必须如此. 自从 0.4 版本开始, 它们可以被彻底删去, 不发挥任何作用, 相当于文件格式第 4 条所描述的注释. 我们建议您不再使用中括号定义的标题, 最好是替换成用 # 符号开始的注释, 以增加配置文件的可读性.

命令行选项

上述配置文件中的选项, 都有命令行的对应体. 因此, 本程序在没有配置文件 (或者配置文件不包含任何可辨认的内容) 的情况下也可以使用. 命令行选项如下所述:

  • -u USERNAME: 用于指出用户名, 对应于配置文件的 username 选项.
  • -p PASSWORD: 用于指出密码, 对应于配置文件的 password 选项.
  • -a ADDRESS: 认证服务器地址或主机名, 对应于配置文件的 address 选项
  • -P PORT: 认证服务器通信端口, 对应于配置文件的 port 选项.
  • -i INTERFACE: 用于获取 MAC 地址的网络界面, 对应于 interface 选项.
  • -s FILE: "uid"信息存储文件的路径, 对应于 uidfile 选项.
  • -l FILE: 日志文件路径. 如果文件不存在, 将被尝试创建. 如果不提供此 -l 选项, 将不记录日志. 如果 -d 选项 (见下文) 启用, 将记录大量有助于调试的信息, 否则只记录异常情况信息. 对应于配置文件的 logpath 选项.

请注意! 以上命令行选项都优先于配置文件发挥作用. 也就是说, 一旦命令行给出了某选项, 那么无论在配置文件中如何设置, 都以命令行选项为准.

更多命令行特有的选项如下:

  • -c FILE: 指定配置文件路径, 用于提供不同于默认路径 (~/.pysrun.cfg) 的配置文件. 小窍门: 用 -c /dev/null 可以彻底告别配置文件.
  • -I: 交互式输入密码. 输入的内容将不会回显. 用于不打算保存密码的情况. 如果使用这一选项, 则交互式输入的内容优先于其它方式给出的密码.
  • -d: 打开调试信息显示. 如果启用日志 (见上文), 将使日志中出现调试信息.
  • -h: 显示使用帮助信息并退出, 不进行任何操作.

登入, 登出和强制离线操作

  1. 登入: 使用 pysrun login 命令. 登入成功后主程序将安静地退出. 需要提供 username, passwordinterface 选项.
  2. 登出: 使用 pysrun logout 命令. 需要知道网络界面和 uid, 因此须提供 uidfile 选项.
  3. 强制离线: 又称踢人, 即让所有占用这个帐号的IP地址离线, 使用 pysrun kick 命令. 需要提供 usernamepassword 选项.

注意: 需要让 pysrun 所在目录在您的 PATH 环境变量中, 否则应使用类似 ./pysrun 的绝对路径启动程序.

主程序返回值

  • 0: 程序正常退出. 意外仍然可能发生, 例如登录成功但是服务器返回的 uid 无法写入文件里. 这种情况下会有警告信息提示, uid 也会回显在警告信息里.
  • 1: 操作失败, 并且服务器返回了一条状态解释失败的原因. 通常是因为人数达到上限, 欠费, 或者在无人在线时强制所有人离线等原因造成.
  • 2: 程序因选项配置错误而退出.
  • 4: 操作系统返回错误, 例如网络不可达, 读文件失败, 或者指定的网络界面无 MAC 地址.
  • 8: 服务器返回了不符合意料格式的信息, 实际操作的状态未知, 不可知, 或未定义.

背景进程

登录成功后, 两个守护进程将留在背景中执行. 其中之一等待将会到来的 login, logoutkick 命令, 另一个每隔1分钟左右向认证服务器发出一个 heartbeat 数据包, 以保持和服务器的通信, 不至于一段时间无活动后断网. 在旧 Linux 客户端登录模式下没有这个保持连接功能. 当执行任何新的登入, 登出和踢人操作后, 背景进程都将得到自动关闭的命令, 将立刻自行退出. 如果被别的用户以任何方式踢掉, 背景进程也将在1分钟内退出. (被踢后保持背景通信是没有意义的, 即使这样做也不能继续使用网络.) 两守护进程相互监视, 其中之一退出后另一个将立即退出.

背景进程正常停止工作将以 0 退出, 否则以非 0 值退出.

正常情况下, 背景进程工作过程中需要在临时文件目录 /tmp 下打开一个 UNIX domain socket 文件 /tmp/pysrun.sock. 工作过程中, 如果用移除或其它任何办法导致此文件不可用, 将产生无法确定的结果.

用法示例

  1. pysrun -c /dev/null -i wlan0 -u USERNAME -p PASSWORD login
    使用 wlan0 界面的 MAC 地址, 不读取任何配置文件 (即只用默认值), 登入.
  2. echo 'pysrun kick' | at midnight
    通过 at 提交一个定时任务, 在今天半夜时刻踢掉所有在线用户.
  3. 有时候, 在登出或者踢人后立刻重新登录, 服务器会认为你已经登录从而返回错误. 这时候只需要等上片刻即可, 或者, 假如你知道这的确是出错的唯一原因, 可以在bash下使用类似
    until pysrun login; do sleep 1; done
    的命令来自动地反复重试. 如果不想看到每次重试产生的错误信息, 可以将其转接到 /dev/null:
    until pysrun login 2> /dev/null; do sleep 1; done
    更好的方式是将返回值检查包括进来:
    pysrun kick && while [[ `pysrun login 2> /dev/null; echo $?` -eq 1 ]]; do sleep 1; done

适用系统

目前在 Linux 系统上经过基本测试. 在各种 BSD 系统上 (包括Free/Net/Open/DragonFlyBSD) 也可以使用, 但未经过测试.

本程序不依赖于系统是 32 或 64 位.

正确执行当前版本需要 Python 2.7.

背景

北师大提供的"官方" Linux 命令行客户端是一个动态编译的 32 位程序. 它具有如下不足:

  • 不适用于 64 位系统, 需要在 64 位系统上再安装 32 位 C 标准库.
  • 是"黑箱"程序, 无源码, 不知其工作原理, 必须诉诸逆向工程.
  • 没有提供合理的配置方法, 亦不返回有用的返回值, 因此几乎无法自动化.
  • 自 Linux 2.6.35 后, 出现了官方客户端无法使用的情况. 其原因是官方客户端在进行 bind() 调用时采取了不规范的用法, 被较新的内核认为是错误的调用而无法执行 (参见 https://lkml.org/lkml/2011/7/9/37, 或 Linux commit d0733d2e). 这导致在较新的系统上官方客户端完全失效.

附注: 在更新的系统上, bind()AF_UNSPEC 类型的地址被允许用于地址为 INADDR_ANY, 见 Linux commit 29c486df, 而这也正是官方客户端所做的. 所以对于此 commit 以后的内核版本, 上一点不能用于作为否定官方客户端的较强论据.

  • 它使用的登录认证模式经常被北师大自己在服务器端禁用.

北师大提供的另一个客户端是个 GTK 图形界面程序. 除了上述缺点同样存在以外, 它显然不能在纯命令行环境下运行.

无论是图形界面还是文字界面下的"官方"客户端, 都存在很多错误或问题, 这些问题没有任何说明, 是在使用中发现的. 我们在 GitHub 的 Wiki 页面上列举了其中的一些问题 (https://github.com/congma/pysrun/wiki/BugsInOriginalClients).

此外, 北师大也没有给出对各种 BSD 系统的支持. 尽管一些 BSD 系统建有 Linux 兼容层或模拟层, 但通过兼容层运行本来就编写甚为 sloppy 的 Linux 程序可能导致难以预料的结果.

因此, 我们需要一个新的客户端可以改变以上所列的不足. 新客户端原生地支持 Linux 和各种 BSD, 支持 32 位和 64 位系统, 有开放的源码, 而且避免了原客户端中的不规范编程. 特别的一点是, 它具有功能完整的命令行和配置文件界面, 并且有确定的返回值, 可以很直接地实现自动化, 如实现 SysV 起始脚本 (init script). 因此我们建议应该用此客户端取代官方客户端.

报告错误

请通过 GitHub 的事项追踪功能汇报错误: https://github.com/congma/pysrun/issues

授权

BSD 许可证, 见文件 COPYRIGHT.

版本信息

2013-03-18 version 1.0.10.