1. 程式人生 > >在伺服器命令列下登入校園網

在伺服器命令列下登入校園網

在伺服器終端下登入校園閘道器(東北大學)

專案動機

​ 實驗室伺服器有時候需要上網下載東西(東大的伺服器校園網不登入也可以下載一些pip源和預設源的資源),但是我們需要登入閘道器才能訪問外網,當然也有使用w3m 等工具上網的辦法,但是實測並不美好,所以想自己寫個小東西可以在命令列登入閘道器。所以,開工。

1 準備工作

1.1設計思路

​ 使用python實現表單的提交,包括填寫使用者名稱密碼 以及submit 操作

1.2環境準備

​ 就在伺服器上進行測試,自帶Python2.7 以及urllib urllib2

​ 需要先學習一點urllib

的使用知識

​ 測試系統為Ubuntu 16.04

​ 需要你有一點Python基礎和Linux基礎

2 開始實現

2.1 登入

2.1.1 實現過程

登入操作

按照urllib 的使用方法,先用字典變數儲存我們要登入的賬戶和密碼,也就是我們要提交的表單的內容,具體表單內容可以在ipgw.neu.edu.cn的頁面原始碼找到。

判斷是否登入成功

把request的頁面轉化成字串,然後找到在登入成功後獨有的一部分字串,比如程式碼的第27行,就是進行這個操作。

2.1.2 遇到的問題

  • 表單中僅僅使用使用者名稱和密碼無法正常登入,這是仔細檢視網頁原始碼,會發現表單中還有好幾項在程式碼的前一段。也就是<input...
    開頭的部分。所以我們在usernamepassword 這兩項之外還要把這些額外的內容新增上。
  • 本來在登入檢測的時候想使用網路已連線 來進行str.find() 但是伺服器報錯了,它無法識別中文,考慮到不同系統環境,這裡我使用的是包含它的div 標記中的樣式來檢測,這個在登入不成功的情況下是沒有的。

2.2 登出

2.2.1 實現過程

登入後的頁面同樣有一個表單,而且submit 是一個登出按鈕,所以簡單修改我們的登入程式,就可以實現登出。

2.2.2 遇到的問題

  • 一開始以為只要登出就行了,但是實際上,登出的表單是有要求username 和ip地址的,但是不光我一個人會登入閘道器,所以使用者名稱是可變的,而且要和之前的登入聯絡起來。所以這裡讓登入程式建立一個檔案temp_username.dat
    來臨時儲存當前登入的校園網賬號,然後登出程式來讀取這個檔案中的username

3 原始碼

3.1 ConnectNeu.py

import urllib2  
import urllib  

class Loginer():  
    def __init__(self, username, password):  
        self.loginUrl = 'http://202.118.1.87/srun_portal_pc.php?ac_id=1&'  
        self.username = username  
        self.password = password  
        self.openner = urllib2.build_opener()  

    def login(self):  
        postdata = {  
            'username': self.username,  
            'password': self.password,  
            'action': 'login',  
            'ac_id': '1',
            'user_ip':'',
            'nas_ip':'',
            'user_mac':'',
            'url':''  
        }  
        postdata = urllib.urlencode(postdata)  
        myRequest = urllib2.Request(url=self.loginUrl, data=postdata)  

        result = self.openner.open(myRequest).read()
        resStr=str(result)
        ind=resStr.find('font-weight:bold;color:orange') 
        if(ind!=-1):
            print 'connected successfully' 
        else:
            print 'connected faild!! Maybe your username or password is wrong!'

def main():  
    username=raw_input('Enter your username:')
    password=raw_input('Enter your password:')
    file=open('temp_username.dat','w')
    file.write(username)
    file.close()
    l = Loginer(username,password)
    l.login()  

if __name__ == '__main__':  
    main()  
    print 'done'

3.2 logout.py

import urllib2  
import urllib  

class Loginer():  
    def __init__(self, username, password):  
        self.loginUrl = 'http://202.118.1.87/srun_portal_pc.php?ac_id=1&'  
        self.username = username  
        self.password = password  
        self.openner = urllib2.build_opener()  

    def login(self):  
        postdata = {  
            'username': self.username,  
            'info': '',  
            'action': 'auto_logout',  
            'usr_ip': '202.199.6.187'  
        }  
        postdata = urllib.urlencode(postdata)  
        myRequest = urllib2.Request(url=self.loginUrl, data=postdata)  

        if(str(self.openner.open(myRequest).read()).find('font-weight:bold;color:orange')!=-1):
            print 'logout successfully' 

def main():  
    file=open('temp_username.dat','r')
    username=file.readline()
    print username
    l = Loginer(username,'')
    l.login()  

if __name__ == '__main__':  
    main()  
    print 'done'

4 Python原始碼檔案生成可執行檔案

這裡只介紹下這裡的簡單應用,詳細請參見其他文件。

4.1 工具介紹

使用pyinstaller 這個工具,在如此優秀的校園網環境下,在終端裡執行下面程式碼

pip install pyinstaller

這裡可能有的同學沒有pip程式,可以輸入su 進入root 使用者,然後輸入下面

apt-get install python-pip
sudo apt-get install python-pip #如果你的使用者本來就是root許可權使用者,用這句

4.2 開始Build,Make

安裝好之後,我們需要就要把我們的程式打包成可執行檔案了。在我們的原始碼目錄下執行下面語句

pyinstaller -F ConnectNeu.py
pyinstaller -F logout.py

程式就會在當前目錄下建立兩個資料夾build dist 和兩個和原始碼同名的檔案。我們需要的可執行檔案就在資料夾dist 中,那兩個檔案直接就可以執行。

注意 Linux中執行當前目錄下的檔案要使用./example 的形式才可以,因為不加前面的兩個符號,它預設是從Path環境變數中的地址來找程式的。就是這樣。