在伺服器命令列下登入校園網
在伺服器終端下登入校園閘道器(東北大學)
專案動機
實驗室伺服器有時候需要上網下載東西(東大的伺服器校園網不登入也可以下載一些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...
username
、password
這兩項之外還要把這些額外的內容新增上。 - 本來在登入檢測的時候想使用
網路已連線
來進行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環境變數中的地址來找程式的。就是這樣。